Backbone js .listenTo vs .on
以下两行代码有什么优点和缺点? 我不明白为什么有两种不同的方式来做同样的事情。
this.listenTo(app.Todos, 'change:completed', this.filterOne); app.Todos.on('change:completed', this.filterOne);
另外当使用.on,我如何确定是默认的上下文?
listenTo
是更新和更好的选项,因为这些监听器会在stopListening
期间被自动删除,当视图被删除时(通过remove()
)被调用。 在listenTo
之前,有一个非常隐秘的问题,因为视图方法被引用为模型上的事件监听器,即使视图实例本身已经不存在了,而且不再存在于DOM中,因此幻影视图将永远listenTo
(泄漏内存并导致错误行为)。
如果您想要阅读listenTo
的背景故事,请在主干github存储库中searchlistenTo
并通读一些较长的问题讨论。
至于默认的上下文,有几件事情可能会被绑定到this
:
- 如果你通过
this.listenTo
进行绑定,它将永远是视图实例(Wim Leers在评论中指出) - 没有
this.listenTo
,故事变得复杂- 对于其他事件,它将是全局对象(最好避免这种情况)
- 对于DOM事件来说,它就像在常规的DOM事件绑定中一样是源元素
- 如果你提供一个明确的上下文(
foo.on
的第三个参数),骨干将使用它(因此这是一个更强大的方法) - 如果您使用ECMA标准
function () {//your event handler}.bind(this)
,您也可以手动控制上下文(也推荐) - 正如@mu指出的那样,
_.bind
或$.proxy
是ECMAfunction.bind
替代品 - 对于骨干视图,当使用任何视图方法作为事件处理程序时,执行
this.bindAll('onClick', ...)
将确保视图实例是this
上下文
- 任何通过使用视图的标准
events
属性连接的events
都会自动绑定到视图实例上(这是带有bindAll
带和吊带)
所以总结一些指导方针:
- 尽可能使用
events
属性,因为它是简洁和正确的 - 使用
this.listenTo
来绑定模型和集合 - 任何额外的绑定记住使用您首选的方法可靠地绑定上下文。 我通常使用ECMA
Function.bind
因为嘿,标准,但是这里有几个很好的select。
通过listenTo
,您想要侦听的事件的对象作为第一个parameter passing。 在on
的情况下,它实际上是一个对象的方法。
listenTo
的优点是:
-
监听器跟踪所有事件处理程序,使其更容易在需要时一次全部删除。
-
callback的上下文总是设置给侦听器本身。