我正在关注backbone.js tutorial并遇到了2个函数initialize()
和render()
。 initialize()
在$(self.el).append()
使用render()
时附加一些html时使用了$(this.el).append()
。我对这种差异感到困惑,会很感激解释,谢谢!
JS代码
// Views
window.WineListView = Backbone.View.extend({
tagName:'ul',
initialize:function () {
this.model.bind("reset", this.render, this);
var self = this;
this.model.bind("add", function (wine) {
$(self.el).append(new WineListItemView({model:wine}).render().el);
});
},
render:function (eventName) {
_.each(this.model.models, function (wine) {
$(this.el).append(new WineListItemView({model:wine}).render().el);
}, this);
return this;
}
});
答案 0 :(得分:4)
当事件触发时范围发生变化时,第一个使用self
来保留对this
的引用。在匿名函数内部(对于事件处理程序),this
将引用触发事件的元素而不是Backbone控制器。
在第二种情况下不需要引用。
答案 1 :(得分:3)
原因是JavaScript如何处理范围。
初始化函数中的他们做了
var self = this;
所以当它们绑定对WineListView实例的引用时,在
上调用了初始化的实例this.model.bind("add", function (wine) {
$(self.el).append(new WineListItemView({model:wine}).render().el);
});
但如果你将“this”作为第三个参数发送,那么可以在没有自变量的情况下完成。 第三个参数应该规定应该在
中调用回调的范围this.model.bind("add", function (wine) {
$(this.el).append(new WineListItemView({model:wine}).render().el);
}, this);
如果你看看渲染是绑定,它也使用第三个参数
this.model.bind("reset", this.render, this);
Disclamer我曾经尝试过代码,但是从阅读骨干文档中得到了这个 http://backbonejs.org/#FAQ-this