我一直在研究基于backbone.js的应用程序的一些示例。我注意到在某些(例如下面的this example)中使用了下划线函数_.bindAll()
:
initialize: function (args) {
_.bindAll(this, 'changeTitle');
this.model.bind('change:title', this.changeTitle);
},
而在其他情况下(例如下面的todo app)请勿:
initialize: function() {
this.model.bind('change', this.render, this);
this.model.bind('destroy', this.remove, this);
},
_.bindAll()
在这种情况下的目的是什么,是否有必要?
答案 0 :(得分:26)
_.bindAll()
在命名函数中更改this
以始终指向该对象,以便您可以使用this.model.bind()
。请注意,在第二个示例中,第三个参数传递给bind()
;这就是为什么在这种情况下不需要使用_.bindAll()
。一般来说,最好使用模型上的任何方法作为事件的回调,以便您可以更轻松地引用this
。
答案 1 :(得分:3)
In Detail: _.bind(ctx, 'method')
采用您的方法,使用绑定到'ctx'的上下文创建副本,并将副本添加为属性。
这是jQuery.bind()
不允许您传入上下文的变通方法。
JQ将始终使用未定义的上下文调用回调。 Backbone建立在jQuery之上。