2013-10-16 80 views
1

所以我有一個視圖包含一些其他視圖,這些視圖都是使用循環添加的。 問題是我想爲每個視圖綁定不同的事件,並且出於某種原因,似乎只有最後一個事件被添加到所有視圖(或者甚至更好,它覆蓋了以前的事件)。Titanium中沒有正確觸發事件

的代碼實際上是非常簡單的,我只是不明白,爲什麼我的變量「PARAMS」始終是字母「S」,當我調試「卡」控制器上:

var stores = ["B", "O", "E", "K", "S", "F"]; 
    for(var i = 0 ; i < 5 ; i++) 
{ 
    var view_b = Titanium.UI.createView 
    ({ 
     backgroundColor:'#92b723', 
     top:0, 
     height:200, 
     width:200, 
     borderRadius: 30 
     // layout:'horizontal' 
    }); 

    // Handle event 
    var params = stores[i]; 
    view_b.addEventListener('click', function(e) { 
      var controller = Alloy.createController("card", params).getView(); 
      controller.open();   
    }); 

    $.carouselView.add(view_b); 

     ... (some other stuff) 
    } 

應該發生什麼每當我點擊任何視圖時,它會將我帶到卡片視圖並顯示我點擊了哪個字母。現在代碼的方式是通過在任何視圖中單擊來獲得「S」。

在此先感謝。

回答

1

JavaScript範圍混淆的經典案例。發生的事情是事件監聽器引用的for-loop範圍正在改變,所以每個事件監聽器的i總是5,因爲它是最後一個創建的範圍,因此對於每個事件監聽器,總是得到「S」。

首先,在for循環中創建事件偵聽器並不是一個好習慣(主要是因爲這個範圍/上下文的東西),試試這個,將你的函數分離成一個命名的函數,然後將PARAMS值傳遞給你的視圖。這樣,你明確地定義了它屬於哪個範圍(視圖),而不是讓JavaScript在你身上做一個數字:

var stores = ["B", "O", "E", "K", "S", "F"]; 

// 1 - Name your event listener function 
// This is a good idea anyway so that you can remove the listener later 
function listener(e) { 
    var controller = Alloy.createController("card", e.source.params).getView(); 
    controller.open(); 
} 

for (var i = 0; i < 5; i++) { 
    var view_b = Titanium.UI.createView({ 
     backgroundColor : '#92b723', 
     top : 0, 
     height : 200, 
     width : 200, 
     borderRadius : 30, 
     // Pass your parameter with the view itself, more explicit 
     params : stores[i] 
    }); 

    view_b.addEventListener('click', listener); 

    $.carouselView.add(view_b); 
} 
+0

完美,有效。謝謝。我將編輯您的代碼以正確訪問變量參數。 – LucasA

0

您必須從循環中移除事件偵聽器,並將其包裝在循環外的函數中。例如:

function listenerHelper(view, params) { 
view.addEventListener('click',function(e) { 
    var controller = Alloy.createController("card", params).getView(); 
    controller.open(); 
} 
} 

然後,您在循環中調用該函數,並將正確的參數傳遞給它。

+0

雖然在自己的函數中分離出它是很好的。這仍然會有相同的範圍問題。 –

+0

其實它在我的代碼中工作。雖然在我的情況下,輔助函數被定義爲原型。 – Olivier

+0

感謝您的回答。我接受了Josiah,因爲把變量參數放在視圖中的技巧對於其他用戶來說可能並不是很清楚(對我來說實際上是必要的)。 – LucasA