函数循环遍历循环并且工作一次但从不再次

时间:2011-04-14 18:12:07

标签: javascript mobile titanium appcelerator

我正在调用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);
    }
}

2 个答案:

答案 0 :(得分:2)

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

首先,buildMediaItemsSelectionTable()功能的问题

  1. 您的for..in循环可能会捕获您不
  2. 的对象属性
  3. 不需要双循环
  4. 以下是适当的修改

    function buildMediaItemsSelectionTable()
    {
      var i = 0, p;
    
      for ( p in mediaItemsSelectionList[0] )
      {
        if ( mediaItemsSelectionList[0].hasOwnProperty( p ) )
        {
          addMediaItemsSelectionSongsRow( i++ );
        }
      }
    }
    

    另一个问题是我不得不猜测,因为你没有提供足够的代码。我假设您正在使用Titanium的变量转发将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是导航或制表符组的一部分,创建模态窗口的代码也不会在任何情况下重新执行。

    如果您希望每次都将新列表转发到模态,则每次都必须重新生成

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

答案 1 :(得分:0)

看起来你的'}'在错误的地方。现在你有一个带有单个(可能是非预期的)副作用的循环 - 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');
    }

}