函数通过循环迭代,只工作一次,不再工作
function iterates through loop and works once but never again
我正在调用一个钛合金模态窗口打开,然后运行一个函数,循环通过一些数据,像这样;
窗口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(),每次都成功调用list。
第一次运行时效果很好。第二次(任何不是第一次的)运行时,需要时间暂停并运行循环,但m永远不会增加?循环暂停后输出'finished'。
任何想法?
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++ );
}
}
}
另一个问题是我不得不猜测,因为你没有提供足够的代码。我假设你用钛的变量转发将list
传递给模态。也许是这样的?
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是nav或tab组的一部分,创建模态窗口的代码在任何情况下都不会重新执行。
如果你想让一个新列表每次都被转发到模态,你必须每次都生成一个新的
button.addEventListener( 'click', function()
{
win.list = randomList();
win.open();
});
看起来你的"}"放错地方了。现在你的循环有一个单一的(可能是无意的)副作用——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');
}
}
相关文章:
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 当我更改innerHtml时,引导选项卡事件不再工作
- 天气应用 API 不再工作
- AngularJS Dropdown在使用指令后不再工作
- 虚拟键盘在更新到 Chrome v50 后不再工作
- $(这个)没有't在onClick事件中不再工作
- 当控制台不在't在chrome中打开,有些项目不再可点击(有些js调用停止工作)
- 升级至Knockout 3.0.0,Templates/Custom Binding Handlers不再工作
- 自定义绑定在KnockoutJS 3.0中不再工作
- 为什么不是'我的jQuery不再工作了
- .replace() 不再为我工作
- 为什么 ngClick 在$compile后不再工作
- AngularJs 路由不再工作.地址栏更改,但视图不会更改
- yam.platform.setAuthToken在IE 8和IE 9中不再工作
- 节点.js版本已更改,脚本不再工作
- 是 ngAnimate 不再工作了
- .click() 不再工作 jquery.
- JS点击功能不再工作以更改链接颜色
- 谷歌地图API不再工作
- 事件处理程序在 html 重新呈现后不再工作