我有一个从远程源填充的 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
变量的值,这与 btn[i]< 的原始代码不同。/code> 循环运行结束后无效。
请记住,事件监听器是在设置事件监听器的原始代码完成后很长时间才被调用的。如果您在事件监听器中使用循环索引,则该索引值不是您期望的值。该闭包以一种非常干净和简单的方式修复了这个问题。
您在评论中提到您还需要循环索引。在这种情况下,您可以这样做:
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
}
现在您可以将 addButton()
函数内的所有 btn[i]
引用替换为 button
,如第一个示例所示,并且当您需要时,您仍然可以使用i
。
关于javascript - 将事件监听器传递给事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17265595/