получить подколлекцию с помощью комбайна и вложенного switchMap - PullRequest
0 голосов
/ 25 апреля 2019

Моя структура данных firebase:

// Listings:
{
    "id1": {
        "title": "Title of id1",
        "category": "cat1",
        "location": "loc1",
        // ...
    },
    "id2": {
        "title": "Title of id2",
        "category": "cat2",
        "location": "loc1",
        // ...
    }
}

// Categories:
{
    "cat1": {
        "name": {
            "de": "Kategorie 1",
            "en": "Category 1"
        },
        "total": 1
    },
    "cat2": {
        "name": {
            "de": "Kategorie 1",
            "en": "Category 1"
        },
        "total": 1
    }
}

// Locations:
{
    "loc1": {
        "name": {
            "de": "Ort 1",
            "en": "City 1"
        },
        "total": 2
    }
}

Мой файл list.service.ts, который я использую в компоненте / шаблоне (с асинхронным):

import {Injectable} from '@angular/core';
import {BehaviorSubject, combineLatest, Observable, pipe} from 'rxjs';
import {AngularFirestore, AngularFirestoreCollection} from '@angular/fire/firestore';
import {map, switchMap, take} from 'rxjs/operators';

import { ListingModel } from '../models/listing.model';

@Injectable()
export class ListingService {
    private listings: Observable<any>;
    private listingCollection: AngularFirestoreCollection<ListingModel>;
    catFilter: BehaviorSubject<string|null>;
    locFilter: BehaviorSubject<string|null>;

    constructor (private db: AngularFirestore) {
        this.listingCollection = this.db.collection<ListingModel>('listings');
        this.cityFilter = new BehaviorSubject(null);
        this.catFilter = new BehaviorSubject(null);
        this.listings = combineLatest(
            this.cityFilter,
            this.catFilter
        ).pipe(
            switchMap(([ort, kategorie]) => this.db.collection('listings', ref => {
                let query: firebase.firestore.CollectionReference | firebase.firestore.Query = ref;
                if (ort) {
                    query = query.where('loc', '==', ort);
                }
                if (kategorie) {
                    query = query.where('cat', '==', kategorie);
                }
                query.orderBy('date');
                return query;
            }).snapshotChanges().pipe(
                map( actions => actions.map( a => {
                    const data: any = a.payload.doc.data() as ListingModel;
                    const id: string = a.payload.doc.id;
                    return { id, ...data };
                }))
            );
        );
    }
    filterByCat(cat: string|null) {
        this.catFilter.next(cat);
    }
    filterByLocation(loc: string|null) {
        this.locFilter.next(loc);
    }
}

Моя проблема сейчас заключается в том, чтоЯ не понимаю, как включить категорию и местоположения вложенных коллекций в combLatest и switchMap, поэтому категории и местоположения для каждого списка включены в заметку.

Может ли кто-нибудь помочь мне здесь?

...