【问题标题】:Appcelerator Studio LiveView recompile errorAppcelerator Studio LiveView 重新编译错误
【发布时间】:2016-09-08 13:31:21
【问题描述】:

LiveView 尝试重新编译时不断收到此错误。任何人都可以了解 LiveView 的工作原理吗?对象“Alloy.Globals.layout.activityList”确实存在,但也许 LiveView 只重新编译不存在 Alloy Globals 的部分代码?

[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 中具有布局对象相同的逻辑。我在做完全相同的事情,但它搞砸了重新编译大约 10 次中的 8 次。

/**
 * 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));
};

#更新

我想我可能已经找到触发错误的原因。运行新的更新代码似乎实际上不是问题,而是在关闭和刷新之前出现错误。

**[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 尝试关闭和刷新时回调会尝试运行,因此会出现编译器错误。移除 window.close 事件中的回调会导致重新加载成功

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

那么,为其他控制器的关闭事件提供回调是完全错误的方法吗?

【问题讨论】:

  • 您确定您的 calculateElementDimensions 方法中的 layout 变量包含 activityList 的键值对吗?跨度>
  • 请发布原始代码,因为这是一个微妙的代码错误,然后我们可以帮助您找到错误。
  • 确实如此,当我对项目进行正常的“运行”时,这些值确实会在应用程序中发挥作用。我更新了上面的代码以包含我的代码来自alloy.js,而不是来自电影示例应用程序。

标签: titanium appcelerator titanium-alloy appcelerator-titanium


【解决方案1】:

是的,代码看起来是正确的。尝试在 LiveView 模式和 Trace Console 模式下运行应用程序,然后查看是否有其他原因导致此问题。

查看图片以设置跟踪模式。

【讨论】:

  • 感谢更新问题。该错误是合理的,因为您在 login.js 窗口不可用时使用了 args 变量。所以,正确的做法是不要在事件监听器中调用回调方法,而是在关闭窗口之前调用它。现在,如果您认为如何知道窗口何时关闭,那么您可以简单地为 iOS 和 Android 中的后退按钮编写 onClick 事件。
  • 是的,没错。为了进一步搞砸,我在回调中打开了一个新控制器。现在我改为只调用 args.callback() 后跟 $.win.close()
  • 太棒了!这是在关闭窗口之前执行任何操作的正确方法。通常我们在开始时认为 onClose 事件会在窗口即将关闭时触发,但现在我们需要在几乎每个应用程序中关闭窗口之前运行代码,因此最好正确覆盖关闭事件。祝你好运!!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2013-05-11
相关资源
最近更新 更多