Backbone.js 如何在主干中正确使用$el和.remove()?
我仍然对此感到困惑。我看到的常见范例是Backbone.js 如何在主干中正确使用$el和.remove()?,backbone.js,Backbone.js,我仍然对此感到困惑。我看到的常见范例是 view.render() 将“渲染”设置为 function () { this.$el.html( this.template() ) } 此行为如何与移除相匹配?这将渲染视图。。但从逻辑上讲,您将调用.remove(),以解除事件绑定并丢弃它。。但如果使用该方法,则已放弃父容器($el),无法重新渲染。文档需要明确表示约定不是this.$el.html(this.template()),而是通过在一些非el父元素上调用.html()来呈现模板。您
view.render()
将“渲染”设置为
function () { this.$el.html( this.template() ) }
此行为如何与移除相匹配?这将渲染视图。。但从逻辑上讲,您将调用.remove()
,以解除事件绑定并丢弃它。。但如果使用该方法,则已放弃父容器($el),无法重新渲染。文档需要明确表示约定不是this.$el.html(this.template())
,而是通过在一些非el父元素上调用.html()
来呈现模板。您可以使用视图自己的$el调用.render(),也可以使用.remove()
这两者是如何协同工作的?我不认为我完全理解你的问题;但我认为如果你看一下标题为: 将视图与其他DOM元素分离 及 清理:避免内存泄漏和重影视图 从下面的链接中,您可能会找到您正在寻找的答案
直到最近,我才开始从视图本身的外部将视图添加到DOM中,这意味着在创建视图时,我不会传入el:。我只是让视图将DOM元素从视图中渲染到内存中,并从调用代码中调用render().$el来渲染视图,就像本文所述。我看到的最佳实践略有不同。完全关闭
el
属性——让主干创建自己的元素。render
方法应如下所示:
render: function() {
this.$el.html(this.template(some_data_from_somewhere));
return this;
}
然后从路由器调用render
,从而:
some_container.append(view.render().el)
如果这样做,则默认的删除实现:
remove: function() {
this.$el.remove();
this.stopListening();
return this;
}
开始变得更有意义了。视图被创建并拥有对其el
的唯一控制权,因此当视图被销毁时,销毁el
非常有意义。视图的所有者创建视图并将其添加到页面中;然后,当所有者处理完视图后,视图的所有者会销毁该视图(通过调用remove
)。这种方法使视图非常独立
当然,如果您的视图希望在创建时绑定到现有的el
,或者有人给它一个el
,那么您必须提供一个自定义的remove
来解除DOM事件的绑定(通过调用this.undelegateEvents()
),删除this.el
(但不是el
本身)类似地,如果你的视图有子视图,那么你应该提供一个remove
,在清理自己之前对所有子视图调用remove
。这应该在文档中。这正是我要找的。谢谢。我不确定我错过了什么,但我读了两本书和官方文档,我没有看到任何人说我ng另外,您让视图创建并拥有自己的el.或,some\u container.append(view.render().el)
google forthis.$el.html(this.template())
——存在很多混乱。您是否调用some\u container.append(view.render().el)
在视图中,还是在路由器中?这实际上不起作用。您不能将事件绑定到实例上不存在的el上。append(view.render().el)
调用通常是在路由器或父视图中的,通常说什么v=new view
都会执行append(v.render().el)
。这当然有效,当视图创建自己的el
:和this.$el.html(this.template())时,主干将把视图的事件绑定到视图的el
很好,因为这只是把东西放在el
中,它与创建el
完全无关。还要看看哪些东西对你和你的问题都是现成的。它是管理诸如删除元素/解除绑定事件/重绘/…如果你被迫只使用主干网,你可以看到哪种方法可以解决问题它们用于您的问题。