使用.off取消激活事件

时间:2012-08-03 23:10:09

标签: firebase

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

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

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

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

2 个答案:

答案 0 :(得分:5)

现在唯一的选择是存储对回调的引用。我们实际上通过让.on()将它返回给你来使这更容易一些。所以你可以这样做:

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

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

但是我们收到了一些像你这样的反馈,说跟踪你的回调引用有时很麻烦。所以我们有一个计划的API更改,这样你就可以只使用一个事件类型或根本没有参数来调用.off(),我们只需要删除所注册的任何回调。但是我们现在专注于其他功能,所以这个变化可能已经超过了1个月。

感谢您的反馈!

答案 1 :(得分: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]);
   }
}