SDK 3.2.1
我正在研究CodeStrong-2012 app并且我注意到应用于控制器对象(on,off,trigger)的未记录方法。 后来,我找到了合金的ChangeLog:
1。0。0(2013年2月19日) **突破性变化**
从View Proxies和控制器中删除了Backbone Events API 对于Alloy View代理和控制器,即使用$ .myid引用的对象 或者使用createController和getView方法创建,您不能使用Backbone Events 用于绑定和取消绑定事件回调或触发事件的API on,off和trigger方法。使用 改为使用Titanium SDK API addEventListener,removeEventListener和fireEvent方法。
以前,Alloy View代理和控制器可以使用Backbone Events API。
问题是,如果我在代码中更改它,例如,更改行:
//oldSection is a controller created with Alloy.createController
oldSection.off('nav', sectionNav);
到
oldSection.removeEventListener('nav', sectionNav);
我收到错误:
[ERROR] : V8Exception: Exception occurred at alloy/controllers/main.js:24: Uncaugh
t TypeError: Object #<Controller> has no method 'removeEventListener'
我做错了吗? 我应该继续使用Backbone方法开启,关闭,触发吗?
答案 0 :(得分:0)
您无法向控制器对象添加和删除事件侦听器。但是,您可以在视图对象上执行此操作:
var view = oldSection.getView();
view.removeEventListener('nav', sectionNav);
Alloy.Controller只有少数方法没有on/off
或add/removeEventListener
。
答案 1 :(得分:0)
这是我能找到的Appcelerator文档的唯一部分,它实际上讨论了on,off,触发事件:
http://docs.appcelerator.com/titanium/latest/#!/guide/Alloy_Collection_and_Model_Objects
http://docs.appcelerator.com/titanium/latest/#!/guide/Alloy_Collection_and_Model_Objects
看看结尾。
答案 2 :(得分:0)
对于新读者来说,一个伟大的Titanium Titan / dev,Fokke Zandbergen发布了这篇与上述评论相矛盾的文章。 http://www.tidev.io/2014/09/10/the-case-against-ti-app-fireevent-2/
从帖子: “你知道每个Alloy控制器都是一个事件调度程序吗?它扩展了Backbone.Events,你可以使用$ .trigger()和ctrl.on()。如果你不使用Alloy,你当然可以扩展Backbone的事件调度员就像我们在上一次考试中所做的那样,或者创建自己的调度员。
这些仅限JS的事件不会越过桥接器,Backbone会抛出一些很好的附加功能,比如ctrl.off(),它甚至可以删除对象的(某个事件)的所有侦听器。
BackBone 1.x具有更多与事件相关的优点,如once()和listenTo(),但目前Alloy仍然附带0.9.2。“
foo.js:
var bar = Alloy.createController('bar');
bar.on('logOut', function onLogOut(e) {
// so bar doesn't keep us from GC
bar.off('logOut', onLogOut);
// so we don't keep bar from GC
bar = null;
});
bar.js:
function onLogOutButtonClick(e) {
$.trigger('logOut');
// we can also free ourself from listeners
// $.off();
}
我刚试过这个,它按预期工作!
- Ti SDK:3.3.0.GA
- iPad 7.1模拟器