Javascript 传递模型问题的变量
我有一个backbonejs应用程序,它的父视图如下:Javascript 传递模型问题的变量,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我有一个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 supp
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的警报(this.model)
警报未定义
我应该提到的是,当我在BookView上查看alert(this.book)时,它并不是未定义的。这是因为
此
已在u.each中更改了上下文。关于它的帖子有上百万篇,所以我不会解释。
以这样的方式结束(使用this)以保持上下文:
_.each(this.model.get("library").books, function(book){
var bookView = new BookView({
el: $('#books'),
book: book,
model: this.model
}, this);
还可以查看下划线的u.bindAll
您的问题与
此
的定义方式有关。此
在函数体中的含义由调用父函数的方式控制。幸运的是,\每个
都允许您在上下文中作为可选的第三个参数传递(上下文在函数体中等同于此)。此处的文档:
不幸的是,这只为第一个函数绑定了this的值,这是您传递到的匿名函数。调用BookView
构造函数时,这不会绑定This
,因为它是一个单独的函数。当你调用一个函数时,它会创建一个单独的作用域,这意味着一个不同的值。一种解决方案是为构造函数使用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);
在这里可以找到关于此
定义的不同方式以及如何使用.bind
和.bindAll
的进一步阅读:如果此
的上下文发生了变化,为什么我可以在我的bookView上执行警报(this.book)
?我尝试了你的答案,但是传递this
似乎无法解决问题?因为您正在将book
传递给您的BookView
,但将不起作用的this.model
作为模型传递。在你的每一个<代码>此。模型
什么都不是此
现在指的是您的each,each中没有模型
对象,但有书
对象。请搜索这个上下文并读懂它,它有点复杂,一旦你得到它,你就知道什么是错的。