我有一个嵌套视图设置,可以在我的应用程序中深入了解。我可以想到很多初始化,渲染和附加子视图的方法,但是我想知道什么是常见的做法。
这是我想到的几个:
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顺序。视图是在很早的时候初始化的,因此在render函数中没有太多事情可以一次完成。
缺点:您被迫重新委托delegateEvents(),这可能会很昂贵?父视图的渲染功能杂乱无章,需要进行所有子视图渲染?您没有设置tagName
元素的能力,因此模板需要维护正确的tagName。
其他方式:
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
?
close
方法和一个对象onClose
,但是我只是好奇如何首先实例化和渲染它们。
delete
JS中的代码与delete
C ++中的代码不同。如果您问我,这是一个名称很差的关键字。