Backbone.js 主干木偶渲染模型()不适用于复合视图

Backbone.js 主干木偶渲染模型()不适用于复合视图,backbone.js,marionette,Backbone.js,Marionette,我使用一个复合视图来显示一个带有主干木偶的表,但是在我对模型进行获取之后,当数据进入时,让模板的包装部分重新加载会遇到一些问题。以下是我的模板: 复合视图的模板: <thead> <tr> {{#each report.columns}} <th>{{name}}</th> {{/each}} </tr> </thead> <tbody></tbody> {{#each cols}

我使用一个复合视图来显示一个带有主干木偶的表,但是在我对模型进行获取之后,当数据进入时,让模板的包装部分重新加载会遇到一些问题。以下是我的模板:

复合视图的模板:

<thead>
 <tr>
  {{#each report.columns}}
   <th>{{name}}</th>
  {{/each}}
 </tr>
</thead>
<tbody></tbody>
{{#each cols}} <td>{{value}}</td> {{/each}}
集合项很好,在获取成功时更新视图。但是,当configModel.fetch()完成时,复合视图模板中的包装器位永远不会更新

在文档中,它表示可以使用.renderModel()只重新渲染视图中处理模型的部分。当我这样做时:

configModel.fetch().success(function(){ tView.renderModel(); });
没有什么变化。但是当我使用.render()时:


它工作正常,并得到更新。这可能暂时有效,但它会重新提交我的整个表格,这可能是一种性能问题

在这种情况下,我认为文档是误导性的。renderModel返回渲染视图的html。它不触及$el

:

如果您对以正确的顺序呈现事物感兴趣,则不必担心显式调用render。相反,您可以推迟显示视图,直到模型获取完成。然后简单地调用App.region.show(查看);会为你安排好一切的

这里有一把小提琴来说明:

如果在显示视图后发生模型更新,并且希望避免重新渲染整个组合,则可以在compositeView中使用modelEvents来更新单个元素

或者,如果你想进一步深入兔子洞,你可以使用一个模型绑定插件。

“可能是一种性能问题”。如果它成为性能问题,为什么不担心呢?非常感谢!非常感谢你提到的所有选择。这很有意义。我认为renderModel会做的事情看起来有点像是真的。虽然这个名字有点误导。使用你建议的承诺应该可以做到这一点。
configModel.fetch().success(function(){ tView.renderModel(); });
configModel.fetch().success(function(){ tView.render(); });
renderModel: function(){
  var data = {};
  data = this.serializeData();
  data = this.mixinTemplateHelpers(data);

  var template = this.getTemplate();
  return Marionette.Renderer.render(template, data);
},
var metaPromise = Mod.metaModel.fetch({dataType: "jsonp"});
var tagsPromise = Mod.tagsCollection.fetch({dataType: "jsonp"});

metaPromise.done(function(data) {
    App.region.show(Mod.compositeView);
});

tagsPromise.done(function(data) {
    console.log("tags fetched!"); 
});
modelEvents: {
    "change:name": "nameChanged" 
 },