移除/关闭Firebase监听器

时间:2018-08-17 20:56:14

标签: javascript firebase firebase-realtime-database vue.js

我有Vue组件,它们正在监听Firebase事件,并且在安装Firebase参考/侦听器时创建它们。但是,当用户离开该页面时,我想删除beforeDestroy()生命周期挂钩中的所有侦听器。这是删除Firebase参考/侦听器的“正确”方法吗?

getFirebaseRef(path){
  return firebase.database().ref(path)
},

beforeDestroy(){
  // get firebase ref
  let fbPath = `/projects/proj_${this.currentLessonId}/components/${this.component.id}`
  this.getFirebaseRef(fbPath)
  .then((ref) => {
    // remove listener
    ref.off("value", (snap) => {
    })
    ref.off("child_added", (snap) => {
    })
    ref.off("child_removed", (snap) => {
    })
  })
},


mounted(){
  // get firebase ref
  let fbPath = `/projects/proj_${this.currentLessonId}/components/${this.component.id}`
  this.getFirebaseRef(fbPath)
  .then((ref) => {
    // add listener
    ref.on("value", (snap) => {
      doSomething1()
    })
    ref.on("child_added", (snap) => {
      doSomething2()
    })
    ref.on("child_removed", (snap) => {
      doSomething3()
    })
  })
},

2 个答案:

答案 0 :(得分:3)

您始终可以进行呼叫,但是如果在同一路径上有多个监听者,它将变得更加棘手。

ref.off("value")

侦听器返回对该侦听器的引用,所以这就是我的方法。

let listener = ref.on("value", function(snapshot){
//do something
}

ref.off("value", listener)

答案 1 :(得分:0)

Firebase具有分离侦听器的能力 可以通过在Firebase数据库参考上调用off()方法来删除回调。

您可以通过将单个侦听器作为参数传递给off()来删除它。在不带参数的位置上调用off()会删除该位置上的所有侦听器。

在父侦听器上调用off()不会自动删除在其子节点上注册的侦听器;还必须在任何子侦听器上调用off()才能删除回调。 有关更多信息,请单击此链接。 https://firebase.google.com/docs/database/web/read-and-write