1

我有一个从远程源填充的 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]);
4

2 回答 2

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
}

现在您可以将函数btn[i]内的所有引用替换为第一个示例中的引用,并且您仍然可以在需要时使用它。addButton()buttoni

于 2013-06-23T22:29:36.767 回答
0

您正在 i 在 for 循环中创建一个闭包。当循环退出时,所有创建的函数都将在同一个 var i 上有一个闭包,该值对于所有函数来说都是“长度”,因此是未定义的。

于 2013-06-23T22:30:15.277 回答