Firebase 使用.off禁用事件

Firebase 使用.off禁用事件,firebase,Firebase,大多数my.on事件都使用闭包: ref.on( 'child_added', function( snapshot ) { userCallback( snapshot.val() ); } ); 这意味着,无法使用.off()停用这些监视器,因为off需要原始回调指针和eventType。我怎么能做这种事 我的应用程序(jQuery Mobile)是基于页面的。当用户点击某个页面时,我想激活监视器。当用户离开该页面时,我

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

  ref.on( 'child_added',
          function( snapshot ) {
             userCallback( snapshot.val() );
          } );
这意味着,无法使用.off()停用这些监视器,因为off需要原始回调指针和eventType。我怎么能做这种事


我的应用程序(jQuery Mobile)是基于页面的。当用户点击某个页面时,我想激活监视器。当用户离开该页面时,我想取消激活,因此当他们重新进入时,我不会有多个监视器。我想我只想使用eventType调用.off(),并删除所有回调。

现在唯一的选择是存储对回调的引用。实际上,我们让.on()将其返回给您,从而使这一过程变得更简单。因此,您可以:

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

// later...
ref.off('child_added', childCallback);
但我们收到了几条类似于您的反馈,称有时跟踪您的回调引用会很麻烦。因此,我们有一个计划中的API更改,以便您可以仅使用事件类型或根本不使用参数调用.off(),并且我们将删除注册的任何回调。但我们现在关注的是其他功能,所以这一变化可能需要1个多月的时间


谢谢你的反馈

在此期间,您可以使用简单的管理器模式重现这种行为。例如:

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]);
   }
}
现在支持这一点。看,这是否已经实施(四年多之后)?我还没有测试过,但是如果我可以在路由更改时简单地调用
.ref('/').off()
,在我的redux应用程序中会很棒。这样的话,你只会听到你所看到的事物的变化,而背景中的状态不会发生变化