[英]Passing event listener in to event listener?
我有一個從遠程源填充的tableView。 我在每行上動態添加了幾個按鈕,每行的按鈕和內容位於for循環中。 我在按鈕偵聽器中有一個警報對話框偵聽器。 一旦出現此對話框(如果選擇確認(是)),我希望能夠更改按鈕標題。
我收到以下錯誤:
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]);
在某個地方有這樣的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
}
現在,您可以像在第一個示例中一樣,用button
替換addButton()
函數內的所有btn[i]
引用,並且在需要時仍可以使用i
。
您正在for循環中在i上創建一個閉包。 當循環退出時,所有創建的函數將在完全相同的var i上有一個閉包,對於所有函數,該值均為“ length”,因此未定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.