将模型传递给 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的主要内容,如果未能解决你的问题,请参考以下文章

将模型传递给视图

将模型从 jquery ajax 传递给控制器

Django将多个模型传递给模板

将 knockoutjs 视图模型传递给多个 ajax 调用

cshtml将模型值传递给javascript函数[重复]

Django - 将模型名称从 url 传递给视图