コード例 #1
0
export function FirebaseObjectFactory(ref, { preserveSnapshot } = {}) {
    const objectObservable = new FirebaseObjectObservable((obs) => {
        let fn = ref.on('value', (snapshot) => {
            obs.next(preserveSnapshot ? snapshot : utils.unwrapMapFn(snapshot));
        }, err => {
            if (err) {
                obs.error(err);
                obs.complete();
            }
        });
        return () => ref.off('value', fn);
    }, ref);
    return observeOn.call(objectObservable, new FirebaseZoneScheduler(new NgZone({}), {}));
}
コード例 #2
0
function firebaseListObservable(ref, _a) {
    var preserveSnapshot = (_a === void 0 ? {} : _a).preserveSnapshot;
    var toValue = preserveSnapshot ? (function (snapshot) { return snapshot; }) : utils.unwrapMapFn;
    var toKey = preserveSnapshot ? (function (value) { return value.key; }) : (function (value) { return value.$key; });
    var listObs = new FirebaseListObservable(ref, function (obs) {
        var handles = [];
        var hasLoaded = false;
        var lastLoadedKey = (null);
        var array = [];
        ref.once('value', function (snap) {
            if (snap.exists()) {
                snap.forEach(function (child) {
                    lastLoadedKey = child.key;
                });
                if (array.find(function (child) { return toKey(child) === lastLoadedKey; })) {
                    hasLoaded = true;
                    obs.next(array);
                }
            }
            else {
                hasLoaded = true;
                obs.next(array);
            }
        }, function (err) {
            if (err) {
                obs.error(err);
                obs.complete();
            }
        });
        var addFn = ref.on('child_added', function (child, prevKey) {
            array = onChildAdded(array, toValue(child), toKey, prevKey);
            if (hasLoaded) {
                obs.next(array);
            }
            else if (child.key === lastLoadedKey) {
                hasLoaded = true;
                obs.next(array);
            }
        }, function (err) {
            if (err) {
                obs.error(err);
                obs.complete();
            }
        });
        handles.push({ event: 'child_added', handle: addFn });
        var remFn = ref.on('child_removed', function (child) {
            array = onChildRemoved(array, toValue(child), toKey);
            if (hasLoaded) {
                obs.next(array);
            }
        }, function (err) {
            if (err) {
                obs.error(err);
                obs.complete();
            }
        });
        handles.push({ event: 'child_removed', handle: remFn });
        var chgFn = ref.on('child_changed', function (child, prevKey) {
            array = onChildChanged(array, toValue(child), toKey, prevKey);
            if (hasLoaded) {
                obs.next(array);
            }
        }, function (err) {
            if (err) {
                obs.error(err);
                obs.complete();
            }
        });
        handles.push({ event: 'child_changed', handle: chgFn });
        return function () {
            handles.forEach(function (item) {
                ref.off(item.event, item.handle);
            });
        };
    });
    return observeOn.call(listObs, new FirebaseZoneScheduler(new NgZone({}), {}));
}
コード例 #3
0
function firebaseListObservable(ref, { preserveSnapshot } = {}) {
    const toValue = preserveSnapshot ? (snapshot => snapshot) : utils.unwrapMapFn;
    const toKey = preserveSnapshot ? (value => value.key) : (value => value.$key);
    const listObs = new FirebaseListObservable(ref, (obs) => {
        const handles = [];
        let hasLoaded = false;
        let lastLoadedKey = (null);
        let array = [];
        ref.once('value', (snap) => {
            if (snap.exists()) {
                snap.forEach((child) => {
                    lastLoadedKey = child.key;
                });
                if (array.find((child) => toKey(child) === lastLoadedKey)) {
                    hasLoaded = true;
                    obs.next(array);
                }
            }
            else {
                hasLoaded = true;
                obs.next(array);
            }
        }, err => {
            if (err) {
                obs.error(err);
                obs.complete();
            }
        });
        const addFn = ref.on('child_added', (child, prevKey) => {
            array = onChildAdded(array, toValue(child), toKey, prevKey);
            if (hasLoaded) {
                obs.next(array);
            }
            else if (child.key === lastLoadedKey) {
                hasLoaded = true;
                obs.next(array);
            }
        }, err => {
            if (err) {
                obs.error(err);
                obs.complete();
            }
        });
        handles.push({ event: 'child_added', handle: addFn });
        let remFn = ref.on('child_removed', (child) => {
            array = onChildRemoved(array, toValue(child), toKey);
            if (hasLoaded) {
                obs.next(array);
            }
        }, err => {
            if (err) {
                obs.error(err);
                obs.complete();
            }
        });
        handles.push({ event: 'child_removed', handle: remFn });
        let chgFn = ref.on('child_changed', (child, prevKey) => {
            array = onChildChanged(array, toValue(child), toKey, prevKey);
            if (hasLoaded) {
                obs.next(array);
            }
        }, err => {
            if (err) {
                obs.error(err);
                obs.complete();
            }
        });
        handles.push({ event: 'child_changed', handle: chgFn });
        return () => {
            handles.forEach(item => {
                ref.off(item.event, item.handle);
            });
        };
    });
    return observeOn.call(listObs, new FirebaseZoneScheduler(new NgZone({}), {}));
}