我有一个嵌套的视图设置,可以在我的应用程序有些深入。我可以想到许多初始化、渲染和附加子视图的方法,但我想知道通常的做法是什么。
下面是我想到的一对夫妇:
initialize : function () {
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
},
render : function () {
this.$el.html(this.template());
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
优点: 您不必担心使用附加来维护正确的 DOM 顺序。视图是在早期初始化的,所以在呈现函数中不需要同时做很多事情。
缺点: 您被迫重新委托 Events () ,这可能代价高昂?父视图的渲染函数与所有需要发生的子视图渲染混杂在一起?您无法设置元素的 tagName
,因此模板需要维护正确的 tagNames。
另一种方式:
initialize : function () {
},
render : function () {
this.$el.empty();
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
this.$el.append(this.subView1.render().el, this.subView2.render().el);
}
优点: 你不必重新委托事件。您不需要一个只包含空占位符的模板,您的 tagName 将重新由视图定义。
缺点: 现在您必须确保按照正确的顺序添加内容。父视图的渲染仍然受到子视图渲染的影响。
在 onRender
活动中:
initialize : function () {
this.on('render', this.onRender);
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
},
render : function () {
this.$el.html(this.template);
//other stuff
return this.trigger('render');
},
onRender : function () {
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
优点: 子视图逻辑现在与视图的 render()
方法分离。
在 onRender
活动中:
initialize : function () {
this.on('render', this.onRender);
},
render : function () {
this.$el.html(this.template);
//other stuff
return this.trigger('render');
},
onRender : function () {
this.subView1 = new Subview();
this.subView2 = new Subview();
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
我已经在所有这些例子中混合并匹配了一些不同的实践(非常抱歉) ,但是您会保留或添加哪些实践呢?你不会做什么?
做法摘要:
initialize
或 render
中实例化子视图?render
或 onRender
中执行所有子视图渲染逻辑?setElement
还是 append/appendTo
?