我有三种不同的方法来初始化和呈现视图及其子视图,每一种都有不同的问题。我很好奇是否有更好的方法来解决所有的问题:
在父类的Initialize函数中初始化子类。这样,渲染过程中就不会出现任何阻塞。
initialize : function () {
//parent init stuff
this.child = new Child();
},
render : function () {
this.$el.html(this.template());
this.child.render().appendTo(this.$('.container-placeholder');
}
存在的问题:
最大的问题是,第二次在父对象上调用render将删除所有子对象的事件绑定。(这是因为jQuery的$.html()的工作方式。)这可以通过调用this.child.delegateEvents().render().appendTo(this.$el);来缓解,但是第一个,也是最常见的情况,你做了更多不必要的工作。
通过附加子元素,可以强制呈现函数了解父元素DOM结构,以便获得所需的顺序。这意味着更改模板可能需要更新视图的渲染函数。
仍然在父类的initialize()中初始化子类,但是使用setElement().delegateEvents()将子类设置为父类模板中的元素而不是追加。
initialize : function () {
//parent init stuff
this.child = new Child();
},
render : function () {
this.$el.html(this.template());
this.child.setElement(this.$('.placeholder-element')).delegateEvents().render();
}
问题:
delegateEvents()现在是必要的,这是一个轻微的负面影响,因为它只在第一种情况下的后续调用中是必要的。在父方法render()中初始化子方法。
initialize : function () {
//parent init stuff
},
render : function () {
this.$el.html(this.template());
this.child = new Child();
this.child.appendTo($.('.container-placeholder').render();
}
问题:
这意味着渲染函数现在必须与所有的初始化逻辑绑定在一起。
如果我编辑一个子视图的状态,然后在父视图上调用render,一个全新的子视图将被创建,它当前的所有状态将丢失。这似乎也可能会导致内存泄漏。
我很想知道你们对这件事的看法。您会使用哪种场景?或者有没有第四种魔法可以解决所有这些问题?
你曾经跟踪过视图的渲染状态吗?比如renderedBefore标志?看起来真的很糟糕。