Функция перебирает цикл и работает один раз, но никогда больше - PullRequest
1 голос
/ 14 апреля 2011

Я вызываю модальное окно 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 ]

2 голосов
/ 15 апреля 2011

Здесь я вижу несколько проблем.

Во-первых, проблемы с вашей buildMediaItemsSelectionTable() функцией

  1. Ваш цикл for..in может отлавливать свойства объекта, которые вы не делаете.
  2. Нет необходимости в двойном цикле

Вот эти изменения на месте

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

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

Другая проблема, о которой я должен догадаться, так как выне предоставил достаточно кода.Я предполагаю, что вы передаете 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 голосов
/ 14 апреля 2011

Похоже, ваш '}' не в том месте. Прямо сейчас у вас есть цикл с единственным (вероятным непреднамеренным) побочным эффектом - 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');
    }

}

...