2013-06-23 68 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上具有闭包,对于所有函数,该值将是“长度”,因此是未定义的。