渲染 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 模板的主要内容,如果未能解决你的问题,请参考以下文章
ThinkPHP学习 --- 25模板引擎和视图渲染 --------------26视图赋值和过滤 ----------------学习