1

我的观点之一应该是监听窗口调整大小事件,所以我试图覆盖 delegateEvents 和 undelegateEvents 来绑定/取消绑定该监听器。

在视图类中,我放了这个:

delegateEvents: => 
    $(window).on 'resize',@windowResized
    super

undelegateEvents: => 
    $(window).off 'resize',@windowResized
    super

但是不知何故,这会导致一旦视图被实例化,就会立即被 delegateEvents 调用 undelegateEvents,我认为这是它处理某些错误情况的方式。为什么这不起作用,做我想做的事情的正确方法是什么?

编辑:

看起来问题可能与重写 delegateEvents 无关。即使自定义的 delegateEvents 方法被注释掉,undelegateEvents 也会被立即调用。为什么会这样?

编辑2:

为了给混合添加更多奇怪的东西,即使在调用了 undelegateEvents 之后,在 events 属性中定义的其他事件也会继续工作。

4

1 回答 1

1

如果你看Backbone源代码,View.delegateEvents方法定义如下:

 delegateEvents: function(events) {
      if (!(events || (events = _.result(this, 'events')))) return;
      this.undelegateEvents();
      //...
 }

所以 Backbone 在内部调用了undelegateEvents第一件事。这大概是为了使delegateEvents方法可重入,因此可以多次调用而不会产生副作用。

您可以通过让超类首先委托事件来解决此问题:

delegateEvents: => 
  super
  $(window).on 'resize',@windowResized
于 2013-01-21T14:16:40.947 回答