我有一个具有父视图的backbonejs应用程序,如:
var LibraryView = Backbone.View.extend({
initialize: function(options) {
if (options) {
_.extend(this, options);
}
this.render();
alert(this.model); //Alerts Object Object like it's supposed to
_.each(this.model.get("library").books, function(book){
var bookView = new BookView({
el: $('#books'),
book: book,
model: this.model
});
bookView.render();
});
}
});
我的bookView看起来像:
var BookView = Backbone.View.extend({
initialize: function(options) {
if (options) {
_.extend(this, options);
}
alert(this.model); // Alerts undefined
}
});
基本上,我正在尝试将this.model从LibraryView传递给BookView,但是当我这样做时,BookView的alert(this.model)
警告未定义?
我应该提一下,当我在BookView上alert(this.book)
时,它并不是未定义的。
答案 0 :(得分:1)
这是因为this
改变了_.each中的上下文。关于它的帖子有一百万,所以我不会解释。
结束你们每个人(有了这个)来保持背景:
_.each(this.model.get("library").books, function(book){
var bookView = new BookView({
el: $('#books'),
book: book,
model: this.model
}, this);
也看看Underscore的_.bindAll http://underscorejs.org/#bindAll
答案 1 :(得分:0)
您的问题与this
的定义方式有关。 this
在函数体中的含义由您调用父函数的方式控制。幸运的是,_.each
允许您传递上下文(上下文是函数体中的等价)作为可选的第三个参数。文档:http://underscorejs.org/#each。
不幸的是,这只会为第一个函数绑定this的值,这是您传递给_.each
函数的匿名函数。当您调用this
构造函数时,这不会绑定BookView
,因为它是一个单独的函数。当你调用一个函数时,它会创建一个单独的范围,这意味着一个不同的值(除此之外)。一种解决方案是使用bind
作为构造函数。
试试这个:
_.each(this.model.get("library").books, function(book){
var bookView = new BookView({
el: $('#books'),
book: book,
model: this.model
}).bind(this);
bookView.render();
}, this);
此处可以通过this
定义的_.bind
以及如何使用_.bindAll
和{{1}}的不同方式进一步阅读:http://blog.bigbinary.com/2011/08/18/understanding-bind-and-bindall-in-backbone.html