1

ビューの1つは、ウィンドウのサイズ変更イベントをリッスンする必要があるため、delegateEventsとundelegateEventsをオーバーライドして、そのリスナーをバインド/アンバインドしようとしています。

ビュークラスに、私はこれを置きました:

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

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

しかし、どういうわけか、これにより、ビューがインスタンス化されるとすぐにundelegateEventsがdelegateEventsによって呼び出されます。これは、エラーケースを処理する方法であると思います。なぜこれが機能しないのでしょうか。また、私がやろうとしていることを行う正しい方法は何ですか。

編集:

結局のところ、問題はdelegateEventsのオーバーライドに関係していないようです。カスタムdelegateEventsメソッドがコメントアウトされている場合でも、undelegateEventsはすぐに呼び出されます。なぜこれができるのでしょうか?

編集2:

ミックスにさらに奇妙さを加えるために、undelegateEventsが呼び出された後でも、eventsプロパティで定義された他のイベントは引き続き機能します。

4

1 に答える 1

1

バックボーンのソースコードを見ると、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 に答える