Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 如何在主干中正确使用$el和.remove()?_Backbone.js - Fatal编程技术网

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 for
this.$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
完全无关。还要看看哪些东西对你和你的问题都是现成的。它是管理诸如删除元素/解除绑定事件/重绘/…如果你被迫只使用主干网,你可以看到哪种方法可以解决问题它们用于您的问题。