我的一个观点应该是监听窗口大小调整事件,所以我试图覆盖delegateEvents和undelegateEvents来绑定/取消绑定该侦听器。
在视图类中,我把它放在:
delegateEvents: =>
$(window).on 'resize',@windowResized
super
undelegateEvents: =>
$(window).off 'resize',@windowResized
super
但不知何故,这会导致在实例化视图后,delegateEvents会立即调用undelegateEvents,我认为这是处理某些错误情况的方法。为什么这不起作用以及我正在做的事情的正确方法是什么?
编辑:
看起来问题可能与覆盖delegateEvents无关。即使注释掉了自定义的delegateEvents方法,也会立即调用undelegateEvents。为什么会这样?
编辑2:
即使在调用了undelegateEvents之后,为混合添加更多的怪异,在events属性中定义的其他事件仍然可以工作。
答案 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