如何分离然后重新附加Backbone.View而不解除绑定事件?

时间:2011-12-01 15:02:53

标签: javascript dom backbone.js

我有一个由嵌套子视图组成的Backbone系统,我偶尔会在其中执行以下操作。

  1. 从DOM中分离子视图
  2. 从头开始(从模板)重新渲染父视图
  3. 正确重新附加子视图 地方
  4. 我通过调用$(parent.el).html(...)然后$(parent.el).append(child.el)

    之类的内容来执行此操作

    我一直看到的这种技术是孩子的事件处理程序丢失了。所以我尝试过很多东西,到目前为止都没有。

    1. 首先使用$.detach()
    2. 分离child.el
    3. 克隆child.el节点并重新附加克隆
    4. 重新连接后再次调用child.delegateEvents()
    5. 唯一对我有用的是从头开始重建子视图。有没有人有任何想法?重新连接现有节点会更有效率。

      谢谢!

3 个答案:

答案 0 :(得分:3)

我遇到了类似的问题。这似乎对我有用:

this.undelegateEvents();
this.$el.hide();
this.$el.detach();

// do whatever here

this.$el.appendTo(containerElement);
this.delegateEvents();
this.$el.slideDown('fast');

我仍然不确定为什么事件监听器会消失,但是当我查看Chrome开发人员工具窗口时,我可以确认它们实际上已经消失了。这很奇怪,因为Roatin Marth有一个例子(http://jsfiddle.net/Xcrhb/1)没有出现这个问题。

答案 1 :(得分:1)

我做的完全一样。

// First of all pre-render child view
childView.render();

// Append in one place
parentView.$el.append(childView.el);

// Detach in another place
childView.$el.detach();

// And append it again
parentView.$el.append(childView.el);

答案 2 :(得分:-2)

你正在尝试做什么似乎是对Backbone的黑客攻击。通过设置事件委派和重新呈现视图而不是分离,克隆,更改和重新附加,最好使用本机功能。这样做不会增加任何性能。

如果您解释了为什么需要这样做以及为什么本地Backbone的做事方式对您不起作用,那么帮助会更容易。