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

Posted

技术标签:

【中文标题】渲染 Marionette/Backbone 视图时将变量传递到 Handlebars 模板【英文标题】:Passing variables into Handlebars template when rendering Marionette/Backbone View 【发布时间】:2015-07-23 05:13:15 【问题描述】:

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

我想要做的是将(布尔)变量传递到视图中,这样 Handlebars 将决定(通过块助手#if varName)渲染什么。为清楚起见,我不想保留这些数据,所以我真的不想让它们成为我要渲染的模型的一部分。

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

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 = true 行的各种排列,例如isNewDoc: true,但我没有得到任何结果。我做错了什么?

【问题讨论】:

【参考方案1】:

当我想这样做时,我会覆盖 serializeData 方法。您也可以通过覆盖模型中的 toJSON 方法来做到这一点,但是正如您所提到的,当您持久保存模型时,它将被发送到服务器。由于这些是计算属性而不是持久属性,所以我不喜欢将它们发送到服务器。下面是一个例子:

var newUser = new app.UserView(

  model: new app.UserModel(),

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

【讨论】:

【参考方案2】:

@Tyler Marien,我对此进行了测试,也许它适用于普通的 Backbone.View,但对于 Marionette.ItemView 它没有:(

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

好消息是 View.templateHelpers 似乎完全符合我的要求 - 请查看 http://marionettejs.com/docs/marionette.view.html#viewtemplatehelpers - 并且 View.mergeOptions 似乎也适用。我的主要收获:记住 RTFM。

【讨论】:

serializeData 是Marionette.ItemView 特有的一种方法,因此它肯定会起作用。对于您正在做的事情,templateHelpers 可能是一个更好的解决方案,而不是我经常使用的东西,所以感谢您指出。

以上是关于渲染 Marionette/Backbone 视图时将变量传递到 Handlebars 模板的主要内容,如果未能解决你的问题,请参考以下文章

关于ASP.NET MVC部分视图渲染问题。

Spring MVC:无法渲染视图 - $ 正在视图中渲染

部分视图和渲染部分视图有啥区别?

ThinkPHP学习 --- 25模板引擎和视图渲染 --------------26视图赋值和过滤 ----------------学习

从另一个局部视图渲染局部视图

渲染web视图