我正在使用带有Marionette.CompositeView模板的Handlebars。模板定义为:
template : function (serializedData) {
var templFn = Handlebars.compile(myTemplateDef);
return this.templFn(serializedData);
}
在传统的Backbone with Handlebars中,建议每次渲染视图时都不要编译模板,而是将编译后的模板存储为View属性,这样它只会被编译一次,从而节省了资源:
templFn : Handlebars.compile(myTemplateDef),
render : function () {
var serializedData = this.model.toJSON();
...
this.$el.append(this.templFn(serializedData);
}
但是在Marionette案例中,template()的上下文是window
,我不控制如何/何时调用template()。
所以问题是:鉴于我们不想创建一个全局var window.templFn
,有没有办法将模板编译与Marionette的用法分开?
答案 0 :(得分:0)
有一个木偶手柄插件:https://github.com/asciidisco/Backbone.Marionette.Handlebars
它可能不完全是最新的,但您至少应该能够看到他们如何处理模板的编译。
一般情况下,Marionette提供了一个Marionette.Renderer
和Marionette.TemplateCache
对象,允许模板编译一次,只编译一次,然后从缓存的模板编译中重新渲染。
答案 1 :(得分:0)
我刚刚开始在2天前与Marionette合作,我在木偶(纯骨干)之前的代码中使用了Handlebars,然后我在木偶中使用了这种方式:
template : function(data) {
if (typeof this.tplFun === 'undefined') {
this.tplFun = Handlebars.compile($('#angry_cat-handlebars').html());
}
return this.tplFun(data);
};
或者您只需将tplFun添加到初始化函数
即可