我仍然对此感到困惑。我看到的共同范式出现了......
view.render()
将渲染设置为
function () { this.$el.html( this.template() ) }
此行为如何与删除?这会渲染视图..但是从逻辑上讲,你会调用.remove()
取消绑定事件并抛弃它..如果你使用它,你已经抛弃了父容器($ el),并且无法重新启动-render。文档需要明确,然后约定不是this.$el.html( this.template() )
,而是通过在某些非el父元素上调用.html()
来呈现模板。您可以使用自己的$ el视图调用.render(),也可以使用.remove()
。
这两者如何协同工作?
答案 0 :(得分:3)
我看到的最佳做法略有不同。完全取消el
属性 - 让骨干创建自己的元素。 render
方法应如下所示:
render: function() {
this.$el.html(this.template(some_data_from_somewhere));
return this;
}
然后从路由器调用render
:
some_container.append(view.render().el)
如果你这样做,那么默认的remove
实现:
remove: function() {
this.$el.remove();
this.stopListening();
return this;
}
开始变得更有意义。视图已创建并且可以单独控制其el
,因此视图在被销毁时销毁el
非常有意义。视图的所有者创建视图并将其添加到页面中;然后,当所有者完成视图时,视图的所有者会破坏视图(通过调用remove
)。这种方法使视图非常独立。
当然,如果您的视图希望绑定到现有的el
,或者有人在创建时给它el
,那么您将不得不提供自定义{{ 1}}取消绑定DOM事件(通过大概调用remove
),删除this.undelegateEvents()
(但不是this.el
本身)等的内容。同样,如果你的视图有子视图,那么你提供一个el
,可以在清理自己之前给所有孩子打电话remove
。
答案 1 :(得分:0)
我不认为我完全理解你的问题;但我想如果你看一下标题为的部分:
将视图与其他DOM元素分离
和
清理:避免内存泄漏和鬼视图
形成以下链接,然后您可能只找到您要找的答案。
http://coenraets.org/blog/2012/01/backbone-js-lessons-learned-and-improved-sample-app/
直到最近,我才开始从视图外部向DOM添加我的视图,这意味着我在创建视图时不会传入el:我只是在视图中将DOM元素从视图中呈现到内存中,并从调用代码调用render()。$ el来呈现视图,就像文章所述。