函数遍历循环并一次运行,但从未再次运行
我打开一个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);
}
}
有几个问题我在这里看到。
首先,你buildMediaItemsSelectionTable()
功能的问题
- 你for..in循环可能赶上对象属性你不
- 没有必要为双回路
这里的那些修改到位
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();
});
这些答案都不正确,但彼得你是对的我应该发布更多的代码。现在它已经解决了,而这正是你在上面发布的内容,它让我了解了我的解决方案,或者至少有一种不同的思考方式,谢谢。 – 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');
}
}
谢谢。在大多数情况下,我会完全同意,在这种情况下,我使用'm'来获取对象的长度,然后以原始方式调用另一个for循环'for(i = 0; i
如果有帮助的列表存储在Ti.App.Properties.getList ( '列表');所以函数doLoop()每次都可以访问它。 – bh88 2011-04-14 18:24:55
JSON对象,我相信约3深与更多的对象,但我只是在拳头深度 – bh88 2011-04-14 18:32:23
没有好更好的更新代码上面。我已经验证了每次使用Titanium对应的'Ti.API.info(list)'的列表,并且它确实存在并且通过该循环运行,但是第二个循环从不运行,因为第一个循环不会增加 – bh88 2011-04-14 18:41:00