[英]Titanium JavaScript event handler and class scope
在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 =這個賦值是復制而不是引用...
這種行為的原因是什么?
你是對的。
您正在做的事情與Titanium有關,每當您向Titanium本機對象添加屬性時,它都會按值傳遞,因為底層對象(您的視圖)實際上是本機映射到JavaScript對象。 所以會發生的是,該對象的當前值(在您的情況下this
)通過Javascript到本機橋發送並設置為本機對象的屬性(或類似的東西)。
它歸結為,您設置的本機對象上的任何屬性都被對象克隆得很多,這就是您看到上述功能的原因。
那么有什么方法可以解決這個問題呢?
這是簡單的方法:
var self = this;
this.button.addEventListener('click', function(e){
console.log(self.var1);
console.log(self.var2);
});
它有點污染你的按鈕監聽器范圍,但至少它不在全局范圍內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.