【发布时间】:2015-01-13 15:12:34
【问题描述】:
我有一个使用 Marionette 的 Web 应用程序,它经常需要渲染大型嵌套视图树。我想通过确保在将父容器放入 DOM 之前渲染子元素并将其放置在父容器中来避免尽可能多的重排。如何渲染这些子元素来实现这一点?
我目前正在 onRender 函数中呈现所有子视图,据我所知,它们与父视图同时显示,但我找不到任何文档告诉我这是它的预期用途是什么。我还考虑过onBeforeShow 的使用,我知道它肯定会在视图放入 DOM 之前调用,但它使重新渲染变得更加复杂,因为我不能只调用 render。
根据要求,这里有一些代码可以更好地了解我的情况:
var Layout = LayoutView.extend({
//...
initialize: function() {
listenTo(this.model, "some event indicating that data changed", this.render);
},
onRender: function() {
//Will this new view render at the appropriate time to minimize page reflows?
this.someRegion.show(new view(new model()));
}
});
如果我选择使用onBeforeShow,那么我可以传递对容器区域的引用
var Layout = LayoutView.extend({
//...
initialize: function() {
listenTo(this.model, "some event indicating that data changed", this.callback);
},
callback: function() {
this.container.show(this, {forceShow: true});
},
onBeforeShow: function() {
//Does not cause a page reflow, but this solution isn't pretty.
this.someRegion.show(new View(new Model()));
}
});
var LayoutContainer = LayoutView.extend({
//...
onRender: function() {
var model = new LayoutModel();
var layout = new Layout({
model: model,
container: this.containerRegion
});
this.containerRegion.show(layout);
}
});
或者让父对象监听并告诉视图何时渲染
var Layout = LayoutView.extend({
//...
onBeforeShow: function() {
//Does not cause a page reflow, but this solution isn't pretty.
this.someRegion.show(new View(new Model()));
}
});
var LayoutContainer = LayoutView.extend({
//...
onRender: function() {
var model = new LayoutModel();
this.layout = new Layout({ model: model });
listenTo(model, "some event indicating that data changed", this.rerenderSubview);
this.containerRegion.show(this.layout);
},
rerenderSubview: function() {
this.containerRegion.show(this.layout, {forceShow: true});
}
});
【问题讨论】:
标签: javascript marionette