Я разрабатываю на iOS 9.2 SDK & Titannium SDK v5.1.2.GA.Странное событие барботажа в проекте сплава титана Appcelerator
В моем приложении для iPad; есть вкладка продукта, в которой есть кнопка «Скидка». При нажатии на нее, поповер с TextField и Picker показано, как это:
выше создается на лету. (не используя контроллер + вид).
Это работает по назначению. Я хотел бы расширить это немного дальше, записав данную скидку на продукт в alloy.js
в глобальной переменной массива, которая называется Alloy.Globals.ProductDiscounts = [];
(поэтому ее можно использовать позже).
Способ, которым я «захватываю» новую цену скидки, слушая событие «скрыть» на сборщике. Затем обновите глобальный массив.
Для отладки цели, я добавил журнал консоли, чтобы убедиться, что она становится правильно, а затем записывается в окне консоли Appcelerator студии, я начал видеть этот бесконечный вывод так:
я должен был убить симулятор, чтобы остановить этот странный постоянный вывод нулей.
Это мой код до сих пор, любая идея, почему окно консоли размывается? Кроме того, почему мой глобальный массив не устанавливается? или он становится установленным, но я пропустил фактическую запись console.log?
// Subscribe to line discount button click event
lineDiscountButton.addEventListener('click', function(e)
{
// Stop further events
e.cancelBubble = true;
// Create popover
var discountPopover = Titanium.UI.iPad.createPopover({
arrowDirection: Titanium.UI.iPad.POPOVER_ARROW_DIRECTION_RIGHT,
orignalPrice: e.source.orignalPrice,
priceButton: e.source.priceButton
});
var discountPopoverView = Titanium.UI.createView({
width: 250,
height: 210
});
// Create discount popover view wrapper
var discountPopoverViewWrapper = Titanium.UI.createView({
top: 10,
left: 10,
right: 10,
bottom: 10,
layout: 'vertical'
});
discountPopoverViewWrapper.add(Titanium.UI.createLabel({
top: 0,
left: 0,
color: '#5C5C5C',
font: {
fontSize: 12
},
text: 'Enter a new Price'
}));
discountPopoverViewWrapper.add(Titanium.UI.createView({
top: 0,
height: 1,
backgroundColor: '#0088CE',
width: '100%'
}));
var discountPrice = Titanium.UI.createTextField({
top: 0,
width: '100%',
height: Titanium.UI.SIZE,
hintText: discountPopover.orignalPrice,
value: discountPopover.orignalPrice,
backgroundColor: '#FFFFFF',
font: {
fontSize: 18,
fontWeight: 'bold'
},
color: '#5C5C5C'
});
discountPopoverViewWrapper.add(discountPrice);
discountPopoverViewWrapper.add(Titanium.UI.createLabel({
top: 10,
left: 0,
color: '#5C5C5C',
font: {
fontSize: 12
},
text: 'Or Select a Discount Percent'
}));
discountPopoverViewWrapper.add(Titanium.UI.createView({
top: 0,
height: 1,
backgroundColor: '#0088CE',
width: '100%'
}));
var discountPercentPicker = Titanium.UI.createPicker({
top: 0,
width: Titanium.UI.FILL,
height: 112
});
var discountPercentValues = [];
for (var i = 0; i <= 100; i++) {
discountPercentValues.push(Titanium.UI.createPickerRow({
title: i +'%'
}));
}
discountPercentPicker.add(discountPercentValues);
discountPercentPicker.addEventListener('change', function(e) {
if (parseInt(e.rowIndex) === 0) {
discountPrice.value = discountPopover.orignalPrice;
} else {
discountPrice.value = (discountPopover.orignalPrice - (discountPopover.orignalPrice * (parseInt(e.rowIndex)/100))).toFixed(2);
}
});
discountPopoverViewWrapper.add(discountPercentPicker);
// Add discount popover view wrapper to view
discountPopoverView.add(discountPopoverViewWrapper);
// Set popover content view
discountPopover.contentView = discountPopoverView;
// Subscribe to popover hide event
discountPopover.addEventListener('hide', function(e) {
e.cancelBubble = true;
Alloy.Globals.ProductDiscounts[discountPopover.priceButton.sku] = parseFloat(discountPrice.value).toFixed(2);
Alloy.Globals.LiveBasketCollection.executeQuery("UPDATE live_basket SET Price = "+ discountPrice.value +" WHERE Sku = '"+ discountPopover.priceButton.sku +"'");
discountPopover.priceButton.price = Alloy.Globals.DeviceDefaults.CurrencySymbol + discountPrice.value;
discountPopover.priceButton.title = (discountPopover.priceButton.basketQuantity > 0 ? discountPopover.priceButton.basketQuantity +' x ' : '') + discountPopover.priceButton.price;
Titanium.App.fireEvent('redrawBasket');
discountPopover = discountPopoverView = discountPrice = discountPercentPicker = discountPercentValues = null;
console.log(Alloy.Globals.ProductDiscounts);
});
// Show popover
discountPopover.show({
view: lineDiscountButton,
animated: true
});
});
Это странно, что шкура событие discountPopover вызывается снова и снова. Что-то, что вы делаете в прослушивателе событий, запускает popover для отображения/скрытия в цикле. Может быть, потому, что вы устанавливаете свойства, которые появляются в обратном вызове?Попробуйте удалить все, кроме журнала, чтобы узнать, связано ли это. –
если я удалю 'console.log (Alloy.Globals.ProductDiscounts);' и заменил его на 'console.log (Alloy.Globals.ProductDiscounts [discountPopover.priceButton.sku])' - я не получаю цикл, и я вижу просто одно значение, которое я просто задал в массиве, как и ожидалось. Какая странная вещь. Может быть, ошибка в студийной студии? – Latheesan
Странно. Если бы вы могли сузить это в максимально возможном, воспроизводящем код, не могли бы вы сообщить об этом как об ошибке? Пожалуйста, проверьте, является ли это известной проблемой в [Appcelerator JIRA] (https://jira.appcelerator.org/). Если это не так, создайте билет, ссылку на этот вопрос, но также предоставите воспроизводимый код, шаги и информацию об окружающей среде в самом билете. Не забудьте оставить ссылку на билет здесь, чтобы другие могли наблюдать за ней. –