Search code examples
javascriptmobiletitaniumappcelerator

function iterates through loop and works once but never again


I'm calling a Titanium modal window to open and then run a function which loops through some data like so;

Window 1:

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

Window 2: (called from window 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() is called successfully each time and list is called each time successfully.

The first time run it works perfectly. The second(any that isn't first) time run it takes time to pause and run the the loop but m is never incremented? After the pause for the loop outputs 'finished'.

Any ideas?

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

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

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

Solution

  • There are several issues I see here.

    First, the problems with your buildMediaItemsSelectionTable() function

    1. Your for..in loop might catch object properties you don't
    2. There's no need for the double loop

    Here's those modifications in place

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

    The other issue is one I'm having to guess at since you didn't provide enough code. I'm assuming that you're passing list to the modal with Titanium's variable forwarding. Perhaps something like this?

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

    And something has to repeatedly open the modal, right? Maybe a button

    var button = Ti.UI.createButton( {title: 'Modal'} );
    Ti.UI.currentWindow.add( button );
    
    button.addEventListener( 'click', function()
    {
      win.open();
    });
    

    But according to your description, list changes so let's make a random list generator and plug it in to our page so the entire thing looks like this

    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)];
    }
    

    What's wrong here? randomList() is only called once, regardless of how many times you open the modal. Even if window1 is part of a nav or tab group, the code that creates the modal window doesn't re-execute under any circumstances.

    If you want a new list to be forwarded to the modal every time, you'll have to generate it fresh every time

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