将模型传递给 LayoutView Backbone.Marionette
Posted
技术标签:
【中文标题】将模型传递给 LayoutView Backbone.Marionette【英文标题】:Passing a model to a LayoutView Backbone.Marionette 【发布时间】:2015-03-12 18:56:34 【问题描述】:我正在尝试将 model 传递给 LayoutView,以便可以在视图中编辑特定的模型属性。
在我的 ItemView 中,我有一个事件可以抓取所选模型并将其分配给我的全局 App-
var ItemView = Backbone.Marionette.ItemView.extend(
template: _.template(ItemTemplate),
tagName: "tr",
attributes: function()
return
"id": this.model.get('id'),
"class": "tr"
;
,
events:
"click #edit" : "edit"
,
edit: function()
App.EditModel = this.model;
console.log(App.EditModel); // <-- prints out the model successfully
App.trigger('edit');
)
然后,我在编辑视图中使用 App.EditModel 传递给我的模板-
var Layout = Backbone.Marionette.LayoutView.extend(
model: App.EditModel,
template : _.template(EditTemplate),
regions :
"HomeRegion": "#home"
);
return Layout;
);
在浏览器中我得到-“Uncaught ReferenceError: firstName is not defined”,因为模型没有正确映射。
我应该如何处理?
【问题讨论】:
所以你在点击事件之后从它的模型中的某个 ItemView 实例设置 App.EditModel 。您确定在这两个事件之后实例化 Layout 并将正确的模型传递给 ItemView 实例吗? 是的,分配给App.EditModel
的模型是正确的,如果我在LayoutView
中添加onShow
函数,我可以console.log(App.EditModel)
并打印出模型成功地。 @Evgeniy
其中一个模板是否引用了“firstName”?在哪种情况下可以包含该代码,以及 Layout 和 ItemView 是如何被实例化的?
@ne8il,是的,它在 editTemplate 中被引用。但是,模板代码与我遇到的问题无关。如果我将App.EditModel
更改为App.ModelCollection.get(1)
,一切正常。此外,如果我将硬编码索引“1”更改为我从模型中获取的变量,它就不起作用。示例-App.ModelCollection.get(App.ModelIndex)
【参考方案1】:
当您第一次看到您的布局代码时,extend 函数会运行您的所有选项,此时我想App.EditModel
尚不存在,因此模型存储为undefined
如果您想将模型传递给您的LayoutView
,那么您应该在实例化它时执行此操作,即new Layout(model: this.model);
【讨论】:
这正是我所需要的。我知道这一定是时间问题。谢谢你,@昆斯!像魅力一样工作! 很好,就像进一步说明一样,我总是避免将模型/集合/任何已经实例化的东西放入扩展类的定义中,就好像它确实存在一样,它将被所有人共享实例,大多数时候不是您想要的。以上是关于将模型传递给 LayoutView Backbone.Marionette的主要内容,如果未能解决你的问题,请参考以下文章