Dam*_*ano 4 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();
...
Run Code Online (Sandbox Code Playgroud)
当我点击按钮时,在我的控制台中我希望找到:
50
Test
Run Code Online (Sandbox Code Playgroud)
但实际上结果是:
50
<null>
Run Code Online (Sandbox Code Playgroud)
如果我移动作业
this.var2 ='测试'
之前
this.button.addEventListener
声明,结果是:
50
Test
Run Code Online (Sandbox Code Playgroud)
听起来像this.button.parentRef =这个赋值是复制而不是引用...
这种行为的原因是什么?
你是对的.
您正在做的事情与Titanium有关,每当您向Titanium本机对象添加属性时,它都会按值传递,因为底层对象(您的视图)实际上是本机映射到JavaScript对象.所以会发生的是,该对象的当前值(在您的情况下this)通过Javascript到本机桥发送并设置为本机对象的属性(或类似的东西).
它归结为,您设置的本机对象上的任何属性都被对象克隆得很多,这就是您看到上述功能的原因.
那么有什么方法可以解决这个问题呢?
这是简单的方法:
var self = this;
this.button.addEventListener('click', function(e){
console.log(self.var1);
console.log(self.var2);
});
Run Code Online (Sandbox Code Playgroud)
它有点污染你的按钮监听器范围,但至少它不在全局范围内.
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |