0

Я разрабатываю на iOS 9.2 SDK & Titannium SDK v5.1.2.GA.Странное событие барботажа в проекте сплава титана Appcelerator

В моем приложении для iPad; есть вкладка продукта, в которой есть кнопка «Скидка». При нажатии на нее, поповер с TextField и Picker показано, как это:

enter image description here

выше создается на лету. (не используя контроллер + вид).

Это работает по назначению. Я хотел бы расширить это немного дальше, записав данную скидку на продукт в alloy.js в глобальной переменной массива, которая называется Alloy.Globals.ProductDiscounts = []; (поэтому ее можно использовать позже).

Способ, которым я «захватываю» новую цену скидки, слушая событие «скрыть» на сборщике. Затем обновите глобальный массив.

Для отладки цели, я добавил журнал консоли, чтобы убедиться, что она становится правильно, а затем записывается в окне консоли Appcelerator студии, я начал видеть этот бесконечный вывод так:

enter image description here

я должен был убить симулятор, чтобы остановить этот странный постоянный вывод нулей.

Это мой код до сих пор, любая идея, почему окно консоли размывается? Кроме того, почему мой глобальный массив не устанавливается? или он становится установленным, но я пропустил фактическую запись 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 
    });  
}); 
+0

Это странно, что шкура событие discountPopover вызывается снова и снова. Что-то, что вы делаете в прослушивателе событий, запускает popover для отображения/скрытия в цикле. Может быть, потому, что вы устанавливаете свойства, которые появляются в обратном вызове?Попробуйте удалить все, кроме журнала, чтобы узнать, связано ли это. –

+0

если я удалю 'console.log (Alloy.Globals.ProductDiscounts);' и заменил его на 'console.log (Alloy.Globals.ProductDiscounts [discountPopover.priceButton.sku])' - я не получаю цикл, и я вижу просто одно значение, которое я просто задал в массиве, как и ожидалось. Какая странная вещь. Может быть, ошибка в студийной студии? – Latheesan

+0

Странно. Если бы вы могли сузить это в максимально возможном, воспроизводящем код, не могли бы вы сообщить об этом как об ошибке? Пожалуйста, проверьте, является ли это известной проблемой в [Appcelerator JIRA] (https://jira.appcelerator.org/). Если это не так, создайте билет, ссылку на этот вопрос, но также предоставите воспроизводимый код, шаги и информацию об окружающей среде в самом билете. Не забудьте оставить ссылку на билет здесь, чтобы другие могли наблюдать за ней. –

ответ

0

Как вопрос ... Почему вы отменяете пузыри.

без дополнительной базы кода Я могу только попытаться сделать предложение.

1) addeventlistener.

lineDiscountButton.addEventListener('click', setupData); 

2) setupData

Function setupData(e) { 

    lineDiscountButton.removeEventListener('click', setupData); 

    Your code from the inline function. 
} 

В основном удалить слушателя событий, как только активированный, поэтому добавлять и удалять по мере необходимости.

Я не хочу научить вас сосать яйца, но чтобы удалить слушателя событий, вы должны использовать точно такие же параметры, как и его добавление. Таким образом, встроенная функция для прослушивателей событий не идеальна, хотя предпочтительнее разделять код на свою функцию.

Next Alloy globals .... Неправильная практика. Я предполагаю, что вы хотите иметь данные только на время работы приложения, а не для будущего использования.

Если вам это нужно для будущего использования, вы можете сохранить данные в свойствах.

Надеется, что это помогает

T.

+0

'Почему ты отменяешь пузырь? - почему бы и нет? Вопрос, о котором я сообщал, выглядел так, как будто бы вспыхивали события. Почему функция on-line для прослушивателей событий не идеальна? Почему вы удаляете прослушиватель событий при запуске события - в чем же цель? Почему сплавы не являются хорошей практикой? Я использую их, потому что мне нужны данные скидок через несколько контроллеров в течение жизненного цикла приложения. Мне не нужно, чтобы он сохранялся с использованием свойств. – Latheesan

+0

Извините, был маниакальный день, хорошо, если я отвечу завтра. Бит длинного ответа на спешку. –

+0

Спасибо. Ценить это. – Latheesan