Javascript 如何在木偶中呈现没有model.toJSON()的模板

Javascript 如何在木偶中呈现没有model.toJSON()的模板,javascript,backbone.js,marionette,Javascript,Backbone.js,Marionette,我正在将我的主干应用程序转换为木偶网,但找不到一个解决方案来呈现带有模型但没有toJSON的模板。据我所知,木偶网自动使用this.model.toJSON呈现模板 这是我的主干代码: $this.el.htmlthis.templatethis.model 在我的模板中,我使用了如下内容: <div> <% if (methodName()) { %> <%= get('attribute'); %> <% } %> </d

我正在将我的主干应用程序转换为木偶网,但找不到一个解决方案来呈现带有模型但没有toJSON的模板。据我所知,木偶网自动使用this.model.toJSON呈现模板

这是我的主干代码:

$this.el.htmlthis.templatethis.model

在我的模板中,我使用了如下内容:

<div>
  <% if (methodName()) { %>
    <%= get('attribute'); %>
  <% } %>
</div>
根据您刚才调用的渲染

木偶网公开一个渲染事件,您可以监听该事件以附加视图内容

// ...snip

initialize: function () {
   this.listenTo(this.model, "change", this.render);
},

onRendererd: function (view) {
    // this is not exactly good practice
    // better handle this on the outside with a layout
    this.$el.appendTo($("#screens"));
}

// ...snip
为了保持木偶惯例,你应该使用木偶

如果您依赖模板中的逻辑,那么重构模板是一个好主意:

<div>
  <% if (booleanAttribute) { %>
    <%= attribute %>
  <% } %>
</div>

我还没有测试过这个,但是我想没有理由可以使用木偶的templateHelper。根据文件:

templateHelpers属性可以应用于任何 呈现一个模板。当此属性存在时,它的内容 将混合到从 序列化数据方法

我认为,与其改变木偶渲染的方式,不如简单地使用templateHelpers为模板提供更多数据。对于您的用例,我将执行以下操作:

templateHelpers: function () {
  return {
    get: function (attribute) {
      return this[attribute];
    }
  }
}

在此格式中,此inside templateHelpers.get指向序列化数据,该数据是一个具有与视图模型属性相对应的属性名的对象。

Marionette将在内部为您调用model.toJSON。如果您依赖于将完整主干模型传递给模板,而这是您永远不应该做的,那么我不得不说您做得不对。很抱歉如果你真的必须这样做,那么你可以覆盖谢谢你的评论。如果我可能会问,为什么通过整个模型是如此错误?我站在提倡无逻辑模板的阵营中。如果您通过了整个主干模型,那么您还可以访问所有方法,而大多数情况下,您并不需要这些方法。调用从模板中转换数据的方法太诱人了。在我看来,模板不应该有这种能力。我的主要原因是:-性能更少的方法调用,更少的内存消耗-渲染前缓存解析-调试更小的模型-更少暴露您的内部工作-这些只是我脑海中出现的一些。为Torsten的解释干杯!这是有道理的
templateHelpers: function () {
  return {
    get: function (attribute) {
      return this[attribute];
    }
  }
}