4

到目前为止,我一直在我的 Rails/Backbone.js 应用程序中使用 EJS 模板。我真的很想开始使用backbone.marionette。我该怎么做才能使它与 EJS 一起工作?

MyView = Backbone.Marionette.ItemView.extend({
  template: "#some-template"
});

它在文档中说我需要为template属性提供一个 jQuery 选择器,但我认为我的 EJS 模板没有。

更新:

这就是我使用模板正常呈现视图的方式:

TasksTree.Views.TaskItem = Backbone.View.extend({
...
  render: function() {
    ...
    this.$el.html(JST['tasks_tree/item'](options));
    return this;
  }

})

我有模板文件夹,其中包含item.jst.ejs如下文件:

<li>
  <label><%= taskTitle %></label>
</li>

我的模板文件夹包含在application.js

4

2 回答 2

10

文档中有一个部分也显示了替换呈现机制的几个示例:

http://derickbailey.github.com/backbone.marionette/#backbone-marionette-renderer/custom-template-selection-and-rendering

看到 JST 为您提供了模板,并且您不需要以任何其他方式缓存它们,但是您可以跳过 MarionetteRenderer对象中内置的大部分功能并完全替换该render功能。


Backbone.Marionette.Renderer.render = function(template, data){
  return JST[template](data);
}

您还可以template用模板路径而不是 jquery 选择器替换视图上 teh 属性的使用:


Backbone.Marionette.ItemView.extend({
  template: "tasks_tree/item"
});

希望有帮助。如果没有,请告诉我。

于 2012-04-16T20:38:23.500 回答
1

我发现这个参考很有帮助:https ://github.com/marionettejs/backbone.marionette/wiki/Using-jst-templates-with-marionette

您可以将render函数替换为类似的内容,这样可以提供更好的错误处理和灵活性。

Marionette.Renderer.render = function(template, data) {
    if(typeof template === 'function') {
        return template(data);
    }
    else {
        if(!JST[template]) throw "Template '" + template + "' not found!";
        return JST[template](data);
    }
};

然后您可以指定模板路径(如前所述):

Backbone.Marionette.ItemView.extend({
    template: "tasks_tree/item"
});

或者,如果您的模板非常简单,您可以使用函数只返回一个字符串:

Backbone.Marionette.ItemView.extend({
    template: function(data) {
        return "<div>" + data.attribute + "</div>";
    }
});
于 2013-05-21T19:38:50.173 回答