带有数据参数的Titanium中的事件处理

时间:2014-03-20 21:10:46

标签: javascript titanium titanium-alloy

好的,我刚刚陷入了一些棘手的问题。每次发生重大更新时,我都需要在我的应用上触发一个事件(因为我想要打开多个窗口,因此需要更新它们)。事情是,在那个事件中,我希望传递一个论点,如下:

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

到目前为止一切顺利,但是当我收到此事件时,我希望能够访问其数据。我发现这样做的唯一方法是创建一个匿名函数,如下所示:

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

大!这样可行!现在这个大问题..当我关闭这个窗口时,我需要删除那个监听器......否则我最终会出现内存泄漏。问题是,如果我更改匿名函数并将其传递给处理程序,我将无法访问数据 - 但如果我不这样做,我无法引用该函数来成功删除它。请帮助!

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

2 个答案:

答案 0 :(得分:1)

您是否有理由需要使用全球应用事件?它们使代码更难以维护,并导致更紧密的耦合依赖关系,当某些东西发生变化时会很脆弱。当试图理解代码时,它也会增加副作用(你未来的自我忘记,而你 会迷失和困惑)。

您遇到的问题可能来自于假设通过分配数据属性它成为参数。传递给fireEvent的对象将是传递给回调参数的对象。

Ti.App.fireEvent('updateView', {data: {name: "foo"}});
Ti.App.addEventListener('updateView', function(e) {
  var name = e.data.name;
});

话虽如此,一般事件可以很容易地通过您展示的fireEvent传递数据。我发现在“点击”事件的情况下,我对动态数据中的静态数据更感兴趣。我使用partial applications :(示例使用Alloy提供的下划线,但功能很容易被填充)

var _ = Alloy._;
var titles   = ['foo', 'bar', 'baz'];
var messages = [
  'This ia s foo message.',
  'But a bar message is better.',
  'Then again a baz message trumps them all.'
];

function onClick(message, e) {
  e.cancelBubble = true; // Not required but shows how to access the event object
  alert(message);
}

var tableData = _(titles).map(function(title, index) {
  var row = Ti.UI.createTableViewRow({title: title});
  row.addEventListener('click', _.partial(onClick, messages[index]));
  return row;
});

var table = Ti.UI.createTableView({
  data: tableData
});

答案 1 :(得分:0)

所以..我明白了。你实际上可以这样做..问题是我以错误的方式注册处理程序。如果您只设置处理程序以接收数据,它将起作用。以上代码示例:

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

然后,删除它:

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