簡體   English   中英

Titanium JavaScript事件處理程序和類范圍

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM