渲染Marionette / Backbone View时将变量传递到Handlebars模板

时间:2015-05-12 11:06:43

标签: backbone.js handlebars.js marionette

我使用带有Backbone和Marionette的Handlebars。我正在编译我的Handlebars模板并将它们存储在一个可以被视图定义引用的对象中。我使用LayoutView和区域在UI中显示我需要的各种项目。

我想要做的是将(布尔)变量传递到视图中,以便Handlebars将做出关于渲染内容的决定(通过块帮助器{{#if varName}})。为了清楚起见,我不想保留这些数据,所以我真的不想让它们成为我传入的模型的一部分。

所以我正在做的是正常定义Backbone.Model和Marionette.ItemView,并尝试通过initialize传递其他变量:

var newUser = new app.UserView({
  model: new app.UserModel(),
  initialize: function(){
    this.isNewDoc = true
  }
});
// display the view in a region using app.regions.maun.show(newUser);
// ...etc.

我想要的是能够传递并能够在Handlebars模板中引用isNewDoc等变量,理想情况是通过{{#if isNewDoc}}...{{/if}}

我尝试了this.isNewDoc = trueisNewDoc: true的各种排列,但我没有到达任何地方。我做错了什么?

2 个答案:

答案 0 :(得分:3)

我想要执行此操作时覆盖serializeData方法。您也可以通过覆盖模型中的toJSON方法来实现,但正如您所提到的那样,当您持久化模型时,它将被发送到服务器。由于这些是计算属性而不是持久属性,因此我不喜欢将它们发送到服务器。一个例子如下:

var newUser = new app.UserView({

  model: new app.UserModel(),

  serializeData: function() {
    return _.extend({
      isNewDoc: true
    }, this.model.toJSON());
  }
}); 

答案 1 :(得分:0)

@Tyler Marien,我测试了它,也许它适用于香草Backbone.View,但对于Marionette.ItemView它没有:(

但是你的建议让我开始研究Marionette.ItemView上的方法,称为serializeData,然后序列化数据的想法是通用的,这反过来又让我回到了Marionette文档。我可能应该首先仔细阅读:)

好消息是View.templateHelpers似乎完全符合我的要求 - 查看http://marionettejs.com/docs/marionette.view.html#viewtemplatehelpers - 而且View.mergeOptions似乎也适用。我的关键点:记得RTFM。