0

Постоянно получать эту ошибку, когда LiveView пытается перекомпилировать. Может ли кто-нибудь пролить свет на то, как работает LiveView? Объект «Alloy.Globals.layout.activityList» существует, но, возможно, LiveView перекомпилирует части кода, в котором не существует сплавов Globals.Appcelerator Studio LiveView recompile error

[ERROR] : Script Error { 
[INFO] : { 
[ERROR] :  column = 36; 
[ERROR] :  line = 28; 
[ERROR] :  message = "undefined is not an object (evaluating 'Alloy.Globals.layout.activityList')"; 

Приложение примера «Фильмы» от Appcelerator использует ту же логику наличия объекта компоновки в Alloy.js. Я делаю то же самое, но его беспорядок upp перекомпилирует около 8 из 10 раз.

/** 
* Calculate element dimensions for given screen size 
* @param {Object} size containing width and height properties 
*/ 
Alloy.Globals.calculateElementDimensions = function(size) { 

    var layout = {}; 

    layout.device = {}; 
    layout.device.width = size.width; 
    layout.device.height = size.height; 

    // lists 
    layout.activityList = {}; 
    layout.activityList.cell = {}; 

    layout.activityList.cell.width = size.width; 
    layout.activityList.cell.height = 60; 
    layout.activityList.cell.spacing = 1; 

    layout.activityList.cell.dateView = {}; 
    layout.activityList.cell.dateView.width = layout.activityList.cell.height; 
    layout.activityList.cell.dateView.height = layout.activityList.cell.height; 

    layout.activityList.cell.detailsView = {}; 
    layout.activityList.cell.detailsView.width = (layout.activityList.cell.width - layout.activityList.cell.dateView.width) - 50; 
    layout.activityList.cell.detailsView.height = layout.activityList.cell.height; 

    layout.activityList.cell.deleteView = {}; 
    layout.activityList.cell.deleteView.width = size.width * 0.2; 
    layout.activityList.cell.deleteView.right = (0 - layout.activityList.cell.deleteView.width); 
    return layout; 
}; 

// Calculate element dimentsions 
Alloy.Globals.layout = Alloy.Globals.calculateElementDimensions(Alloy.Globals.Device); 
Alloy.Globals.getCalculatedWidth = function(_percentage){ 
    return (Alloy.Globals.Device.width * (_percentage/100)); 
}; 

#update

Я думаю, что я мог бы найти, Что вызывая ошибку. Кажется, что это не проблема с запуском нового обновленного кода, а скорее ошибка перед закрытием и обновлением.

**[INFO] : [LiveView] Reloading App** 
[INFO] : Login win close 
[INFO] : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
[INFO] : validateLogInInfo 
[INFO] : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
[INFO] : UI SHUTDOWN COMPLETE. TRYING TO RESUME RESTART 
[INFO] : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
[INFO] : RUNNING CODE IN ACTIVITIES.JS 
[INFO] : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
**[ERROR] : Script Error { 
[ERROR] :  column = 36; 
[ERROR] :  line = 42; 
[ERROR] :  message = "undefined is not an object (evaluating 'Alloy.Globals.layout.device')"; 
[ERROR] :  stack = "Controller\ncreateController\nController\ncreateController\nvalidateLogInInfo\n"; 
[ERROR] : } 
Alloy.createController('login', { 
    callback: validateLogInInfo 
    }).getView().open();** 

Ошибка, похоже, связана с тем, что я запускаю код в обработчике события window.close. Например, в одном контроллере я делаю это:

Alloy.createController('login', { 
    callback: validateLogInInfo 
    }).getView().open(); 

И в login.js я сделать:

$.win.addEventListener('close', function(){ 
    log('Login win close'); 
    args.callback(); 
}); 

Я предполагаю, что обратный вызов затем пытается бежать, когда LiveView пытается закрыть и обновить, следовательно, ошибка компилятора. Удаление обратного вызова в windoew.close результатов событий в успешной перезагрузки

[INFO] : [LiveView] Reloading App 
[INFO] : Login win close 
[INFO] : UI SHUTDOWN COMPLETE. TRYING TO RESUME RESTART 

SO, обеспечивает обратный вызов в тесном случае другого контроллера полностью неправильный путь, чтобы сделать этот материал?

+0

Вы уверены, что ** макет ** переменная внутри вашего метода ** calculateElementDimensions ** содержит пару ключевых значений ** activityList **? –

+0

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

+0

Он делает, и значения действительно работают через приложение, когда я выполняю обычный «Запуск» проекта. Я обновил код выше, чтобы содержать свой код от alloy.js, а не от приложения для примера с фильмами. –

ответ

1

Да, код кажется правильным. Попробуйте запустить приложение в режиме LiveView и в режиме Trace Console, а затем посмотреть, есть ли что-то еще, что вызывает эту проблему. enter image description here

Просмотреть изображение для установки режима трассировки.

+0

Спасибо за обновленный вопрос. Ошибка является разумной, потому что вы используете ** переменную args **, если она недоступна для окна ** login.js **. Итак, правильный способ сделать это заключается в том, что не вызывайте метод обратного вызова в прослушивателе событий, а вызывайте его перед закрытием окна. Теперь, если вы считаете, что, как вы знаете, когда окно закрывается, вы можете просто написать событие onClick для возврата в iOS и Android. –

+0

Yep, тот правильный. Чтобы покончить с этим, я открыл новый контроллер в обратном вызове. Теперь я изменил, чтобы просто вызвать args.callback(), за которым следует $ .win.close() –

+0

Отлично! Это правильный способ выполнить что-либо перед закрытием окна. Обычно мы начинаем думать, что событие onClose запустится, когда окно вот-вот закроется, но в настоящее время нам нужно запустить код, прежде чем закрывать окно почти в каждом приложении, поэтому лучше переопределить события закрытия. Удачи !!!! –