Titanium JavaScript事件处理程序和类范围

时间:2013-09-26 13:44:57

标签: javascript titanium

在Titanium下开发我用OOP JavaScript和事件处理程序范围来遏制这种奇怪的行为。这是我的代码:

MyClass = function()
{
   this.var1 = '50';
   this.button = Ti.UI.createButton({
      ...
   });
   this.button.parentRef = this;
   this.button.addEventListener('click', function(e){
      var self = e.source.parentRef;
      console.log(self.var1);
      console.log(self.var2);
   });

   this.var2 = 'Test';
   ...
   /* this.button is then added to a view */
};
... 
var c = new MyClass();
...

当我点击按钮时,我希望在我的控制台中找到:

50
Test

但实际上结果是:

50
<null>

如果我移动作业

  

this.var2 ='测试'

之前的

  

this.button.addEventListener

声明,结果是:

50
Test

听起来像this.button.parentRef =这个赋值是复制而不是引用......

这种行为的原因是什么?

1 个答案:

答案 0 :(得分:6)

你是对的。

您正在做的事情与Titanium有关,每当您向 Titanium 本机对象添加属性时,它都会按值传递,因为底层对象(您的视图)实际上是 native 映射到JavaScript对象。所以会发生的是,该对象的当前值(在您的情况下为this)通过Javascript到本机桥发送并设置为本机对象的属性(或类似的东西)。

归结为,您设置的本机对象上的任何属性都被对象克隆得很多,这就是您看到上述功能的原因。

那么有什么方法可以解决这个问题?

这是一种简单的方法:

var self = this;
this.button.addEventListener('click', function(e){
    console.log(self.var1);
    console.log(self.var2);
});

它有点污染你的按钮监听器范围,但至少它不在全局范围内。