2012-08-03 69 views
4

的大多數我的。對事件停用事件使用閉:與.off

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

這意味着,這是不可能的.off()停用這些監視器,因爲需要關閉原來的回調指針以及作爲eventType。我怎麼能做這種事情?

我的應用程序(jQuery Mobile)是基於頁面的。當用戶點擊某個頁面時,我想激活監視器。當用戶離開該頁面時,我想要停用,所以當他們重新進入時,我不會得到多個顯示器。我想我只想用eventType調用.off(),並刪除所有回調。

+0

現在支持。請參閱https://www.firebase.com/docs/web/api/query/off.html。 – bennlich 2015-02-06 23:49:27

回答

5

現在唯一的選擇是存儲對回調的引用。我們實際上通過讓.on()將它返回給你來使它更容易一些。所以,你可以這樣做:

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

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

但是我們已經收到了好幾件像你這樣的反饋,稱這是有時繁瑣,保持跟蹤你的回調引用。因此,我們計劃進行API更改,以便您可以僅使用事件類型或根本不使用參數來調用.off(),並且只需刪除所有註冊的回調。但是我們現在專注於其他功能,所以這種改變可能需要1個多月。

感謝您的反饋!

+5

這是否已實施(四年以後)?我還沒有測試過,但如果我可以在路由更改時簡單地調用'..ref('/')。off()',那麼在我的redux應用中會很棒。這樣你只能聽到你正在看的東西的變化,並且狀態在背景中沒有變化 – benipsen 2016-12-29 18:59:47

+0

你說的是,在Redux和React的4年中,你沒有設法讓自己做聽衆經理? – Eduard 2017-10-11 15:04:43

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]); 
    } 
}