以下两行代码有哪些优缺点?我不明白为什么有两种不同的方法来做同样的事情。
this.listenTo(app.Todos, 'change:completed', this.filterOne);
app.Todos.on('change:completed', this.filterOne);
同样在使用.on时,如何确定是默认上下文?
答案 0 :(得分:117)
listenTo
是更新更好的选项,因为在stopListening
期间会自动删除这些侦听器,当视图被删除时(remove()
)会调用这些侦听器。在listenTo
之前,幻象视图永远存在(泄漏内存并导致错误行为)存在一个非常隐蔽的问题,因为视图方法在模型上被引用为事件侦听器,即使视图实例本身已经过去而不再存在DOM。
如果您想阅读listenTo
的背景故事,请在listenTo
的骨干github存储库中搜索,并阅读一些较长的问题讨论。
对于默认上下文,有几件事可能最终绑定到this
:
this.listenTo
进行绑定,它将始终是视图实例(Wim Leers在评论中指出)this.listenTo
,故事变得复杂
foo.on
的第三个参数),骨干将使用它(因此这是一个更强大的方法)function () {//your event handler}.bind(this)
,您也可以手动控制上下文(也推荐)_.bind
或$.proxy
是ECMA function.bind
this.bindAll('onClick', ...)
将确保视图实例是this
上下文events
属性连接的任何事件都将自动绑定到主干的视图实例(这是带bindAll
的腰带和吊带总结一些指导原则:
events
属性,因为它简洁明了this.listenTo
Function.bind
,因为嘿,标准,但这里有几个不错的选择。答案 1 :(得分:0)
使用listenTo
,将要侦听其事件的对象作为第一个参数传递。在on
的情况下,它实际上是该对象的一种方法。
listenTo
优于on
的优点是:
监听器会跟踪所有事件处理程序,以便在需要时更容易将其全部删除。
回调的上下文始终设置为侦听器本身。