如何在骨干网中正确使用$ el和.remove()?

时间:2014-12-04 01:00:23

标签: backbone.js

我仍然对此感到困惑。我看到的共同范式出现了......

view.render()

将渲染设置为

function () { this.$el.html( this.template() ) }

此行为如何与删除?这会渲染视图..但是从逻辑上讲,你会调用.remove()取消绑定事件并抛弃它..如果你使用它,你已经抛弃了父容器($ el),并且无法重新启动-render。文档需要明确,然后约定不是this.$el.html( this.template() ),而是通过在某些非el父元素上调用.html()来呈现模板。您可以使用自己的$ el视图调用.render(),也可以使用.remove()

这两者如何协同工作?

2 个答案:

答案 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来呈现视图,就像文章所述。