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

Why do I need to re-delegate the events of a child view every time the parent view is being re-rendered?

本文关键字:视图 委派 事件 新委派 新渲染 为什么      更新时间:2023-09-26

当然,这将取决于如何重新呈现父视图。父视图在初始化阶段实例化它的所有子视图,并在模板呈现后简单地附加/替换它们。例如,这就是我在渲染方法中的做法:

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

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

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

this.delegateEvents();

我不知道为什么我必须这样做,因为主干网在后台这样做:

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

这个$我从不改变,所以我不知道是什么原因造成了问题。有什么想法吗?

jQuery的replaceWith使用remove,并在其之前插入jQuery的remove文档中的内容

除了元素本身,所有绑定的事件和与元素关联的jQuery数据都将被删除。

因此,您应该重新绑定视图el元素的事件,这是由delegateEvents方法完成的。

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

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

html方法从子元素(从jQuery文档)中删除事件处理程序

此外,jQuery还删除了数据和事件等其他构造处理程序,然后将这些元素替换为新内容。

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

问题是this.delegateEvents()Backbone.View构造函数内只调用一次,当您渲染一次它时,它工作得很好,但在第二次渲染后,您会遇到这个问题。

选项:

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