覆盖Backbone中的delegateEvents

时间:2013-01-21 06:48:49

标签: backbone.js coffeescript

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

在视图类中,我把它放在:

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

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

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

编辑:

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

编辑2:

即使在调用了undelegateEvents之后,为混合添加更多的怪异,在events属性中定义的其他事件仍然可以工作。

1 个答案:

答案 0 :(得分: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