我的大多数.on事件都使用闭包:
ref.on( 'child_added',
function( snapshot ) {
userCallback( snapshot.val() );
} );
这意味着,无法使用.off()停用这些监视器,因为off需要原始回调指针以及eventType。我怎么能这样做呢?
我的应用程序(jQuery Mobile)基于页面。当用户点击某个页面时,我想激活监视器。当用户离开该页面时,我想要取消激活,所以当他们重新进入时,我最终不会有多个监视器。我想我只想用eventType调用.off()并删除所有回调。
答案 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]);
}
}