Marionette view的Handlebars模板在使用前编译一次

时间:2013-03-27 00:07:21

标签: templates backbone.js marionette

我正在使用带有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的用法分开?

2 个答案:

答案 0 :(得分:0)

有一个木偶手柄插件:https://github.com/asciidisco/Backbone.Marionette.Handlebars

它可能不完全是最新的,但您至少应该能够看到他们如何处理模板的编译。

一般情况下,Marionette提供了一个Marionette.RendererMarionette.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添加到初始化函数

即可