Skip to content

Commit b4fb281

Browse files
katowulfdavideast
katowulf
authored andcommitted
fix(firebase_*_factory.js): Fix calls to off() which inadvertently cancel all listeners on the path (#469)
Closes bug #443
1 parent f2d5ba5 commit b4fb281

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

src/database/firebase_list_factory.ts

+13-9
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import 'rxjs/add/operator/mergeMap';
99
import 'rxjs/add/operator/map';
1010

1111
export function FirebaseListFactory (
12-
absoluteUrlOrDbRef:string |
13-
firebase.database.Reference |
14-
firebase.database.Query,
12+
absoluteUrlOrDbRef:string |
13+
firebase.database.Reference |
14+
firebase.database.Query,
1515
{preserveSnapshot, query = {}}:FirebaseListFactoryOpts = {}): FirebaseListObservable<any> {
16-
16+
1717
let ref: firebase.database.Reference | firebase.database.Query;
1818

1919
utils.checkForUrlOrFirebaseRef(absoluteUrlOrDbRef, {
@@ -95,7 +95,7 @@ export function FirebaseListFactory (
9595
return firebaseListObservable(queryRef, { preserveSnapshot });
9696
})
9797
.subscribe(subscriber);
98-
98+
9999
return () => sub.unsubscribe();
100100
});
101101
}
@@ -118,7 +118,7 @@ function firebaseListObservable(ref: firebase.database.Reference | firebase.data
118118
obs.complete()
119119
});
120120

121-
ref.on('child_added', (child: any, prevKey: string) => {
121+
let addFn = ref.on('child_added', (child: any, prevKey: string) => {
122122
arr = onChildAdded(arr, child, prevKey);
123123
// only emit the array after the initial load
124124
if (hasInitialLoad) {
@@ -128,7 +128,7 @@ function firebaseListObservable(ref: firebase.database.Reference | firebase.data
128128
if (err) { obs.error(err); obs.complete(); }
129129
});
130130

131-
ref.on('child_removed', (child: any) => {
131+
let remFn = ref.on('child_removed', (child: any) => {
132132
arr = onChildRemoved(arr, child)
133133
if (hasInitialLoad) {
134134
obs.next(preserveSnapshot ? arr : arr.map(utils.unwrapMapFn));
@@ -137,7 +137,7 @@ function firebaseListObservable(ref: firebase.database.Reference | firebase.data
137137
if (err) { obs.error(err); obs.complete(); }
138138
});
139139

140-
ref.on('child_changed', (child: any, prevKey: string) => {
140+
let chgFn = ref.on('child_changed', (child: any, prevKey: string) => {
141141
arr = onChildChanged(arr, child, prevKey)
142142
if (hasInitialLoad) {
143143
// This also manages when the only change is prevKey change
@@ -147,7 +147,11 @@ function firebaseListObservable(ref: firebase.database.Reference | firebase.data
147147
if (err) { obs.error(err); obs.complete(); }
148148
});
149149

150-
return () => ref.off();
150+
return () => {
151+
ref.off('child_added', addFn);
152+
ref.off('child_removed', remFn);
153+
ref.off('child_changed', chgFn);
154+
}
151155
});
152156
return listObs;
153157
}

src/database/firebase_object_factory.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import { FirebaseObjectFactoryOpts } from '../interfaces';
88
import 'rxjs/add/operator/mergeMap';
99

1010
export function FirebaseObjectFactory (
11-
absoluteUrlOrDbRef: string | firebase.database.Reference,
11+
absoluteUrlOrDbRef: string | firebase.database.Reference,
1212
{ preserveSnapshot, query }: FirebaseObjectFactoryOpts = {}): FirebaseObjectObservable<any> {
13-
13+
1414
let ref: firebase.database.Reference;
1515

1616
utils.checkForUrlOrFirebaseRef(absoluteUrlOrDbRef, {
@@ -19,12 +19,12 @@ export function FirebaseObjectFactory (
1919
});
2020

2121
return new FirebaseObjectObservable((obs: Observer<any>) => {
22-
ref.on('value', (snapshot: firebase.database.DataSnapshot) => {
22+
let fn = ref.on('value', (snapshot: firebase.database.DataSnapshot) => {
2323
obs.next(preserveSnapshot ? snapshot : utils.unwrapMapFn(snapshot))
2424
}, err => {
2525
if (err) { obs.error(err); obs.complete(); }
2626
});
2727

28-
return () => ref.off();
28+
return () => ref.off('value', fn);
2929
}, ref);
30-
}
30+
}

0 commit comments

Comments
 (0)