From b4fb2817122906d942f776314d8e12d3aa244598 Mon Sep 17 00:00:00 2001 From: katowulf Date: Wed, 24 Aug 2016 06:38:50 -0700 Subject: [PATCH] fix(firebase_*_factory.js): Fix calls to off() which inadvertently cancel all listeners on the path (#469) Closes bug #443 --- src/database/firebase_list_factory.ts | 22 +++++++++++++--------- src/database/firebase_object_factory.ts | 10 +++++----- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/database/firebase_list_factory.ts b/src/database/firebase_list_factory.ts index acef168ac..539168462 100644 --- a/src/database/firebase_list_factory.ts +++ b/src/database/firebase_list_factory.ts @@ -9,11 +9,11 @@ import 'rxjs/add/operator/mergeMap'; import 'rxjs/add/operator/map'; export function FirebaseListFactory ( - absoluteUrlOrDbRef:string | - firebase.database.Reference | - firebase.database.Query, + absoluteUrlOrDbRef:string | + firebase.database.Reference | + firebase.database.Query, {preserveSnapshot, query = {}}:FirebaseListFactoryOpts = {}): FirebaseListObservable { - + let ref: firebase.database.Reference | firebase.database.Query; utils.checkForUrlOrFirebaseRef(absoluteUrlOrDbRef, { @@ -95,7 +95,7 @@ export function FirebaseListFactory ( return firebaseListObservable(queryRef, { preserveSnapshot }); }) .subscribe(subscriber); - + return () => sub.unsubscribe(); }); } @@ -118,7 +118,7 @@ function firebaseListObservable(ref: firebase.database.Reference | firebase.data obs.complete() }); - ref.on('child_added', (child: any, prevKey: string) => { + let addFn = ref.on('child_added', (child: any, prevKey: string) => { arr = onChildAdded(arr, child, prevKey); // only emit the array after the initial load if (hasInitialLoad) { @@ -128,7 +128,7 @@ function firebaseListObservable(ref: firebase.database.Reference | firebase.data if (err) { obs.error(err); obs.complete(); } }); - ref.on('child_removed', (child: any) => { + let remFn = ref.on('child_removed', (child: any) => { arr = onChildRemoved(arr, child) if (hasInitialLoad) { obs.next(preserveSnapshot ? arr : arr.map(utils.unwrapMapFn)); @@ -137,7 +137,7 @@ function firebaseListObservable(ref: firebase.database.Reference | firebase.data if (err) { obs.error(err); obs.complete(); } }); - ref.on('child_changed', (child: any, prevKey: string) => { + let chgFn = ref.on('child_changed', (child: any, prevKey: string) => { arr = onChildChanged(arr, child, prevKey) if (hasInitialLoad) { // This also manages when the only change is prevKey change @@ -147,7 +147,11 @@ function firebaseListObservable(ref: firebase.database.Reference | firebase.data if (err) { obs.error(err); obs.complete(); } }); - return () => ref.off(); + return () => { + ref.off('child_added', addFn); + ref.off('child_removed', remFn); + ref.off('child_changed', chgFn); + } }); return listObs; } diff --git a/src/database/firebase_object_factory.ts b/src/database/firebase_object_factory.ts index ffa03be8c..ea45c8e48 100644 --- a/src/database/firebase_object_factory.ts +++ b/src/database/firebase_object_factory.ts @@ -8,9 +8,9 @@ import { FirebaseObjectFactoryOpts } from '../interfaces'; import 'rxjs/add/operator/mergeMap'; export function FirebaseObjectFactory ( - absoluteUrlOrDbRef: string | firebase.database.Reference, + absoluteUrlOrDbRef: string | firebase.database.Reference, { preserveSnapshot, query }: FirebaseObjectFactoryOpts = {}): FirebaseObjectObservable { - + let ref: firebase.database.Reference; utils.checkForUrlOrFirebaseRef(absoluteUrlOrDbRef, { @@ -19,12 +19,12 @@ export function FirebaseObjectFactory ( }); return new FirebaseObjectObservable((obs: Observer) => { - ref.on('value', (snapshot: firebase.database.DataSnapshot) => { + let fn = ref.on('value', (snapshot: firebase.database.DataSnapshot) => { obs.next(preserveSnapshot ? snapshot : utils.unwrapMapFn(snapshot)) }, err => { if (err) { obs.error(err); obs.complete(); } }); - return () => ref.off(); + return () => ref.off('value', fn); }, ref); -} \ No newline at end of file +}