Javascript Tianium中带有数据参数的事件处理

Javascript Tianium中带有数据参数的事件处理,javascript,titanium,titanium-alloy,Javascript,Titanium,Titanium Alloy,好吧,我刚刚遇到了一件棘手的事情。每次重大更新发生时,我都需要在我的应用程序上触发一个事件(因为我希望打开多个窗口,因此需要更新它们)。事情是,在这件事上,我想通过一个论点,像这样: Ti.App.fireEvent('updateViews', {data: my_data}); Ti.App.addEventListener('updateViews', function(data) { var name = data.name; }); 到目前为止还不错,但是当我收到这

好吧,我刚刚遇到了一件棘手的事情。每次重大更新发生时,我都需要在我的应用程序上触发一个事件(因为我希望打开多个窗口,因此需要更新它们)。事情是,在这件事上,我想通过一个论点,像这样:

Ti.App.fireEvent('updateViews', {data: my_data});
Ti.App.addEventListener('updateViews', function(data) 
{ 
     var name = data.name; 
});
到目前为止还不错,但是当我收到这个事件时,我希望能够访问它的数据。我发现这样做的唯一方法是创建一个匿名函数,如下所示:

Ti.App.fireEvent('updateViews', {data: my_data});
Ti.App.addEventListener('updateViews', function(data) 
{ 
     var name = data.name; 
});
太好了!真管用!现在最大的问题是。。当我关闭此窗口时,我需要删除该侦听器。。。否则我将以内存泄漏而告终。问题是,如果我更改匿名函数并将其传递给处理程序,我将无法访问数据-但如果我不这样做,我将无法引用该函数以成功删除它。求求你,救命


PS:有一种方法可以做到这一点,当然我可以使用Alloy.Globals(或标准Ti中的等效物)传递数据,但我想要一个干净、优雅的解决方案,不需要使用Alloy.Globals。提前谢谢。

所以。。我想出来了。你真的可以做到。。问题是我用错误的方式注册了处理程序。如果您只将处理程序设置为接收数据,那么它将起作用。上述代码的示例:

var handler = function(data) {
  var name = data.name;
  alert(name);
}
Ti.App.addEventListener('updateViews', handler);
然后,要删除它:

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

您需要使用全局应用程序事件的原因是什么?它们使代码更难维护,并导致更紧密的耦合依赖关系,当某些内容发生更改时,这些依赖关系很脆弱。它还增加了试图理解代码时的副作用(你未来的自我会忘记,你会迷路和困惑)

您遇到的问题可能来自这样的假设,即通过指定数据属性,它将成为参数。传递给
fireEvent
的对象将是传递给回调参数的对象

Ti.App.fireEvent('updateView', {data: {name: "foo"}});
Ti.App.addEventListener('updateView', function(e) {
  var name = e.data.name;
});
也就是说,正如您所演示的,事件通常可以通过
fireEvent
轻松传递数据。我发现在“点击”事件中,我对静态数据比对动态数据更感兴趣。我使用:(示例使用Alloy提供的下划线,但功能可以很容易地进行多填充)


你好你的回答很有帮助,谢谢。我有点困惑,第一部分实际上帮助很大。第二部分虽然很有用,但我不确定它是否真的能解决这个问题。我需要使用事件的主要原因是因为我想更新一个已打开但当前未聚焦的窗口。我没有对系统中打开的所有窗口的引用,因此我无法更新它(即:准备动画、控制它的子对象等等)。如果您正在寻找静态事件处理的干净解决方案,我认为第二部分是一个漂亮的解决方案。