我有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()
})
})
},
答案 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