2013-09-26 25 views
4

我已经用OOP JavaScript和事件处理程序作用域将这种奇怪的行为加以计算。这是我的代码:在Titanium下开发钛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 =这个任务是通过复制而不是通过参考...

这种行为的原因是什么?

+0

你确定'e.source'是按钮本身吗?这甚至不是一个标准的事件属性。 – Bergi

+0

“Ti.UI.createButton”是否返回实际的DOM元素(事件被触发)本身还是创建一个包装? – Bergi

+0

@Bergi它创建一个[代理对象](http://developer.appcelerator.com/blog/2012/02/what-is-a-titanium-proxy-object.html)到原生的android/ios按钮 – C5H8NNaO4

回答

5

你是对的。

你在做什么有钛,只要你的属性添加到原生对象的皱纹,它是按值传递,作为底层的对象(视图)实际上是映射到JavaScript的一个本地目的。所以会发生的是,该对象的当前值(在你的案例this)通过Javascript到本地桥发送并设置为本地对象(或类似的东西)的属性。

归结起来,你设置的本地对象的任何属性都被对象克隆了很多,这就是为什么你看到了上述功能。

那么有什么办法来解决这个问题?

这是最简单的方法:

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

它有点污染的按钮侦听范围,但至少它在全球范围内没有。