好的,我刚刚陷入了一些棘手的问题。每次发生重大更新时,我都需要在我的应用上触发一个事件(因为我想要打开多个窗口,因此需要更新它们)。事情是,在那个事件中,我希望传递一个论点,如下:
Ti.App.fireEvent('updateViews', {data: my_data});
到目前为止一切顺利,但是当我收到此事件时,我希望能够访问其数据。我发现这样做的唯一方法是创建一个匿名函数,如下所示:
Ti.App.addEventListener('updateViews', function(data)
{
var name = data.name;
});
大!这样可行!现在这个大问题..当我关闭这个窗口时,我需要删除那个监听器......否则我最终会出现内存泄漏。问题是,如果我更改匿名函数并将其传递给处理程序,我将无法访问数据 - 但如果我不这样做,我无法引用该函数来成功删除它。请帮助!
PS:有一种方法可以做到这一点,当然我可以使用Alloy.Globals(或标准Ti中的等效物)传递数据,但我想要一个不需要使用Alloy.Globals的CLEAN,优雅的解决方案。提前谢谢。答案 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);