函数遍历循环并一次运行,但从未再次运行

问题描述:

我打开一个Titanium模式窗口打开,然后运行一个函数,循环显示一些数据,例如:函数遍历循环并一次运行,但从未再次运行

窗口1:

var win = Ti.UI.createWindow({ 
    url: 'window2.js' 
    modal: 1 
}); 
win.open(); 

窗口2:(从窗口1称为)

win = Ti.UI.currentWindow; 

function doLoop() { 
    Ti.API.info('doLoop fn called'); 
    // I've tracked the issue down to here 
    var m = 0; 
    for(var i in list) { m++; } 

    Ti.API.info(m); 
    Ti.API.info('finished'); 
} 

win.addEventListener('open', function() { 
    // list is dynamically generated and passed through successfully from window1.js 
    doLoop(); 
}); 

doLoop()被成功地每次调用和列表每次成功调用。

第一次运行它完美的作品。第二个(任何不是第一个)时间运行需要一段时间来暂停和运行循环,但m不会增加?在循环输出暂停后“完成”。

任何想法?

function buildMediaItemsSelectionTable() { 
    var mediaCount = 0, i; 

    for(i in mediaItemsSelectionList[0]) { mediaCount++; } 

    for(i=0,l=mediaCount;i<l;i++) { 
     addMediaItemsSelectionSongsRow(i); 
    } 
} 
+0

如果有帮助的列表存储在Ti.App.Properties.getList ( '列表');所以函数doLoop()每次都可以访问它。 – bh88 2011-04-14 18:24:55

+0

JSON对象,我相信约3深与更多的对象,但我只是在拳头深度 – bh88 2011-04-14 18:32:23

+0

没有好更好的更新代码上面。我已经验证了每次使用Titanium对应的'Ti.API.info(list)'的列表,并且它确实存在并且通过该循环运行,但是第二个循环从不运行,因为第一个循环不会增加 – bh88 2011-04-14 18:41:00

有几个问题我在这里看到。

首先,你buildMediaItemsSelectionTable()功能的问题

  1. 你for..in循环可能赶上对象属性你不
  2. 没有必要为双回路

这里的那些修改到位

function buildMediaItemsSelectionTable() 
{ 
    var i = 0, p; 

    for (p in mediaItemsSelectionList[0]) 
    { 
    if (mediaItemsSelectionList[0].hasOwnProperty(p)) 
    { 
     addMediaItemsSelectionSongsRow(i++); 
    } 
    } 
} 

另一个问题是e我不得不猜测,因为你没有提供足够的代码。我假设你将list传递给Titanium的可变转发模式。也许这样?

var win = Ti.UI.createWindow({ 
    url: 'window2.js' 
    , modal: 1 
    , list: [1,2,3] 
}); 

而且有东西要重复打开模态,对不对?也许一个按钮

var button = Ti.UI.createButton({title: 'Modal'}); 
Ti.UI.currentWindow.add(button); 

button.addEventListener('click', function() 
{ 
    win.open(); 
}); 

但根据你的描述,list变化让我们做一个随机列表生成等整个事情看起来像这样

var win = Ti.UI.createWindow({ 
    url: 'window2.js' 
    , modal: 1 
    , list: randomList() 
}); 

var button = Ti.UI.createButton({title: 'Modal'}); 
Ti.UI.currentWindow.add(button); 

button.addEventListener('click', function() 
{ 
    win.open(); 
}); 

function randomList() 
{ 
    // Random return an array with 3, 5, or 7 items 
    return [[1,2,3],[1,2,3,4,5],[1,2,3,4,5,6,7]][Math.floor(Math.random()*2)]; 
} 

什么错在这里是将其插入到我们的页面?无论您打开模式多少次,只调用一次randomList()。即使window1是导航或选项卡组的一部分,创建模式窗口的代码在任何情况下都不会重新执行。

如果你不想每次都被转发到模式的一个新的列表,你必须新鲜产生它的每一次

button.addEventListener('click', function() 
{ 
    win.list = randomList(); 
    win.open(); 
}); 
+0

这些答案都不正确,但彼得你是对的我应该发布更多的代码。现在它已经解决了,而这正是你在上面发布的内容,它让我了解了我的解决方案,或者至少有一种不同的思考方式,谢谢。 – bh88 2011-04-15 18:13:16

看起来像你的'}'是在错误的地方。现在你有一个单一的(可能意想不到的)副作用的循环 - m计数到列表的长度,然后调用API.info与列表的长度。

你可能想:

function doLoop() { 
    Ti.API.info('doLoop fn called'); 
    // I've tracked the issue down to here 
    var m = 0; 
    for(var i in list) { 
     m++; 

     Ti.API.info(m); 
     Ti.API.info('finished'); 
    } 

}

+0

谢谢。在大多数情况下,我会完全同意,在这种情况下,我使用'm'来获取对象的长度,然后以原始方式调用另一个for循环'for(i = 0; i bh88 2011-04-14 18:28:49