4

我的大多数 .on 事件都使用闭包:

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

这意味着,无法使用 .off() 停用这些监视器,因为 off 需要原始回调指针以及 eventType。我怎么能做这种事情?

我的应用程序(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 回答