Search code examples
javascripttitaniumtitanium-alloy

Event handling in Titanium with data argument


Ok, I just stepped into something tricky. I need to fire an event on my app everytime a major update happens (because I want multiple windows opened, therefore they need to be updated). The thing is, with that event, I wish to pass an argument, something like this:

Ti.App.fireEvent('updateViews', {data: my_data});

So far so good, but when I receive this event I want to be able to access its data. The only way I found out to do so is to create an anonymous function, like this:

Ti.App.addEventListener('updateViews', function(data) 
{ 
     var name = data.name; 
});

Great! That works! Now the big problem.. when I close this window, I need to remove that listener... Otherwise I'll end up with a memory leak. The thing is, if I change the anonymous function and pass it to a handler, I'm unable to access the data - but if I don't, I cant reference the function to successfully remove it. Please, help!

PS: There IS a way to do this, of course I could pass the data using Alloy.Globals (or the equivalent in the standard Ti), but I want a CLEAN, elegant solution that does not involve using Alloy.Globals. Thanks in advance.


Solution

  • So.. I figured it out. You can actually do that.. The problem was that I was registering the handler the wrong way. It will work if you just only set the handler to receive data. Example for the above code:

    var handler = function(data) {
      var name = data.name;
      alert(name);
    }
    Ti.App.addEventListener('updateViews', handler);
    

    Then, to remove it:

    Ti.App.removeEventListener('updateViews', handler);