4

私の .on イベントのほとんどはクロージャを使用しています:

  ref.on( 'child_added',
          function( snapshot ) {
             userCallback( snapshot.val() );
          } );

つまり、off には元のコールバック ポインタと eventType が必要なため、.off() でこれらのモニタを無効にすることはできません。どうすればこのようなことができますか?

私のアプリ (jQuery Mobile) はページベースです。ユーザーが特定のページにアクセスしたときに、モニターをアクティブにしたい。ユーザーがそのページを離れたときに非アクティブ化したいので、再入力したときに複数のモニターにならないようにします。eventType のみで .off() を呼び出し、すべてのコールバックを削除したいと思います。

4

2 に答える 2

5

現時点で唯一のオプションは、コールバックへの参照を保存することです。.on() を返すことで、実際にこれを少し簡単にします。したがって、次のことができます。

var childCallback = ref.on('child_added', function(snapshot) { /* whatever */ });

// later...
ref.off('child_added', childCallback);

しかし、コールバック参照を追跡するのが面倒な場合があるという、あなたのようなフィードバックをいくつか受け取りました。そのため、API の変更を計画しており、イベント タイプのみ、または引数なしで .off() を呼び出すことができます。登録されているコールバックはすべて削除されます。ただし、現在は他の機能に注力しているため、この変更はおそらく 1 か月以上先になります。

フィードバックをお寄せいただきありがとうございます!

于 2012-08-03T23:36:15.260 に答える
2

当面は、単純なマネージャー パターンを使用して、そのような動作を再現できます。例えば:

function ObserverManager( firebaseRef, page ) {
   this.firebaseRef = firebaseRef;
   this.listeners = {child_added: [], child_removed: [], value: [], child_updated: [], child_changed: []};
   this.page = page;
}

FirebaseObservable.prototype.on(event, callback) {
   this.listeners[event].push( 
      this.firebaseRef.on(event, function(snapshot) {
         callback(snapshot.val());
      })
   );
}

FirebaseObservable.prototype.off(event) {
   var list = this.listeners[event], i = list.length;
   while(i--) {  // 50% more efficient than for(i..; list.length; ...) in IE due to scoping
      firebaseRef.off(event, list[i]);
   }
}
于 2012-08-04T17:46:16.123 に答える