为什么每次重新呈现父视图时都需要重新委派子视图的事件?

时间:2015-03-30 14:43:34

标签: javascript backbone.js backbone-views

当然,这取决于您如何重新渲染父视图。父视图在初始化阶段实例化它的所有子视图,并在渲染模板后简单地附加/替换元素。例如,我将如何在render方法中执行此操作:

this.$('.InputSearch').replaceWith(this.inputSearchView.$el);

因此this.inputSerchView是一个在initialize方法中受影响的实例。

问题是在执行了上面的行之后,在inputSearchView中不再调用事件回调,我需要这样做:

this.delegateEvents();

我不知道为什么我必须这样做,因为骨干在后台执行此操作:

this.$el.on(eventName, selector, method); 

这个。$ el永远不会改变,所以我不知道是什么导致了这个问题。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

jQuery' replaceWith使用remove并在其前面插入内容,来自jQuery的删除文档

  

除了元素本身之外,还删除了与元素关联的所有绑定事件和jQuery数据。

因此你应该重新绑定由el方法完成的查看delegateEvents元素的事件。

答案 1 :(得分:0)

重新渲染视图时,执行此操作:

view.$el.html(Handlebars.compile(view.template)(context));

html方法从子元素(来自jQuery doc)中删除事件处理程序

  

此外,jQuery删除了其他构造,如数据和事件   在用这些元素替换之前,来自子元素的处理程序   新内容。

这就是为什么我必须重新绑定元素/事件

答案 2 :(得分:0)

问题是this.delegateEvents()只在Backbone.View构造函数中被调用一次,并且一旦它运行良好就渲染它,但是在第二次渲染之后你会遇到这个问题。

选项:

  1. 在父视图render()方法
  2. 中初始化子视图
  3. 在子视图this.delegateEvents()方法
  4. 中使用render()