0

我正在使用带有 Marionette.CompositeView 的 Handlebars 模板。模板定义为:

template : function (serializedData) {
    var templFn = Handlebars.compile(myTemplateDef);
    return this.templFn(serializedData);
}

在带有 Handlebars 的传统 Backbone 中,建议不要在每次渲染视图时编译模板,而是将编译后的模板存储为 View 属性,这样它只会编译一次,从而节省资源:

templFn : Handlebars.compile(myTemplateDef),

render : function () {
  var serializedData = this.model.toJSON();
  ...
  this.$el.append(this.templFn(serializedData);
}

但是在 Marionette 的情况下,template() 的上下文是window并且我不控制调用 template() 的方式/时间。

所以问题是:鉴于我们不想创建一个全局变量window.templFn,有没有办法将模板编译与 Marionette 的使用分开?

4

2 回答 2

0

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

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

一般来说,Marionette 提供了一个Marionette.RendererandMarionette.TemplateCache对象来允许一个模板被编译一次,并且只编译一次,然后从缓存的模板编译中重新渲染。

于 2013-03-27T03:17:26.180 回答
0

两天前我才开始使用 Marionette,我在 Marionette (纯骨干)之前的代码中使用了 Handlebars,然后我在 marionette 中使用了这种方式:

template : function(data) {
  if (typeof this.tplFun === 'undefined') {
    this.tplFun = Handlebars.compile($('#angry_cat-handlebars').html());
  }
  return this.tplFun(data);
};

或者您可以将 tplFun 添加到您的初始化函数中

于 2013-03-28T17:13:48.980 回答