2013-06-23 296 views
1

我有一個從遠程源填充的tableView。我在每行上動態添加幾個按鈕,每行的按鈕和內容都在for循環中。我在按鈕監聽器中有一個提醒對話框監聽器。如果確認(YES)被選中,一旦出現這種情況,我希望能夠更改按鈕標題。將事件偵聽器傳遞給事件偵聽器?

我收到以下錯誤:

 Uncaught TypeError: Cannot set property 'title' of undefined. 

這是錯誤的來源:

 btn[i].title = "Finish" 

對不起,我沒有在時刻訪問代碼,並沒有給用得多,但任何幫助/意見將不勝感激工作...

編輯:

虛擬代碼:

 var btn = new Array(); 

     btn[i] = Ti.UI.createButton({ 
      backgroundImage: '/images/button.png', 
      title:'Start', 
      top: 0, 
      left: 0, 
      height: '20%', 
      width: '20%' 
     }); 

     btn[i].addEventListener('click', function(e){ 
      var alert = Titanium.UI.createAlertDialog({ 
       title : 'Dialog', 
       message : 'Change Title', 
       buttonNames : ['Yes', 'No'] 
      }); 
      alert.addEventListener('click', function(e) { 
       if(e.index == 0) { 
        btn[i].title = "Finish"; 
       } 
      }); 
      alert.show(); 
     });           
     tableViewRow.add(btn[i]); 
+0

嘗試在Chrome/Firefox或Firebug中通過類似本機的調試器來運行它,因爲我有一種感覺,它是關於在for循環內部正在改變的實際事件中使用「i」。如果你把代碼放到它自己的函數中,並將你的數組和索引傳入它,那應該可以解決你的問題。 – Turnerj

回答

1

某處你有for循環是這樣的:

for(i = 0; i < btn.length; i++) { 
    // do stuff with btn[i] 
} 

將其更改爲:

for(i = 0; i < btn.length; i++) { 
    addButton(btn[i]); 
} 

function addButton(button) { 
    // do stuff with button 
} 

addButton()函數體將是所有的代碼那是在你的for循環中,有一個區別:你有任何地方btn[i]將它更改爲button

通過將此代碼移動到函數中,您可以創建一個「閉包」,只要需要,它將保留button變量的值,這與循環結束運行後btn[i]變得無效的原始代碼不同。

請記住,事件偵聽器在設置它們的原始代碼完成後被調用很長時間。如果您在事件偵聽器中使用循環索引,那麼該索引值不是您期望的值。封閉以一種非常乾淨和簡單的方式解決了這個問題。

你在評論中提到你也需要循環索引。在這種情況下,您可以這樣做:

for(i = 0; i < btn.length; i++) { 
    addButton(i); 
} 

function addButton(i) { 
    // do stuff with btn[i] 
} 

實際上,現在您不必更改循環體/函數體中的任何代碼。您仍然可以像以前一樣使用btn[i]

或者,你可以這樣來做:

for(i = 0; i < btn.length; i++) { 
    addButton(button, i); 
} 

function addButton(button, i) { 
    // do stuff with button (instead of btn[i]) and i where needed 
} 

現在你可以替換所有buttonaddButton()函數內btn[i]引用作爲第一個例子,你仍然有i可當你需要它。

+0

嗨,感謝您的回答,所使用的循環也是其他元素的計數器,這是否會導致任何衝突。對不起,這很新... – Random

+0

你也可以將索引傳入函數中,只需給它另一個參數即可。我會添加一個例子。 –

+0

謝謝邁克爾...... – Random

0

您在for循環中創建了一個閉包。當循環退出時,所有創建的函數將在同一個變量i上具有閉包,對於所有函數,該值將是「長度」,因此是未定義的。