Извлечение значений из других документов с использованием идентификатора документа, хранящегося в поле в AngularFire5 - PullRequest
0 голосов
/ 01 октября 2019

У меня есть две коллекции: «транспортные средства» и «клиенты». В каждом транспортном средстве я регистрирую клиента через идентификатор документа клиента. Мне нужно получить доступ к заголовку клиента с помощью ключа, который я храню в документе транспортного средства, и отобразить его в таблице данных материала, которая показывает список транспортных средств. Тем не менее, я не могу заставить его работать, и я просто поражен этим.

На рисунке ниже показана таблица, в которой мне нужно отобразить заголовок клиента, используя другой документ. Остальные значения извлекаются из собственного документа транспортного средства.

enter image description here

До сих пор у меня были неудачные попытки с switchMap и с flatMap (возможно, из-заотсутствие опыта использования этих операторов). Единственной успешной попыткой было получить заголовок клиента с помощью вложенного наблюдаемого запроса из наблюдаемых «транспортных средств», и он работает крайне плохо. (Названия клиентов исчезают после сортировки таблицы)

Вот как я выбираю наблюдаемые транспортные средства:

    this.vehicles$ = this.afs.collection<IVehicle>(`vehicles`);
    this.vehicles = this.vehicles$.snapshotChanges().pipe(
  map(actions => {
    return actions.map(a => {
      const data = a.payload.doc.data() as IVehicle;
      const $key = a.payload.doc.id;
      return { $key, ...data };
    });
  })
);

Так я смог выбрать заголовки (неисправности в таблице сортировки). события - названия почему-то исчезают)

    this.vehicles = this.vehicles$.snapshotChanges().pipe(
  map(actions => {
    return actions.map(a => {
      const data = a.payload.doc.data() as IVehicle;
      const $key = a.payload.doc.id;
      const client = data.client;
      const clientTitle = this.afs
        .doc(`clients/${client}`)
        .snapshotChanges()
        .pipe(
          map(foo => {
            const dataFoo = foo.payload.data() as IClient;
            let titleString = dataFoo.title;
            if (client) {
              return { titleString, ...dataFoo };
            } else {
              titleString = 'N/A';
              return { titleString, ...dataFoo };
            }
          })
        );
      return { clientTitle, $key, ...data };
    });
  })
);

Я, должно быть, что-то делаю не так, пытаясь использовать switchMap, так как не могу получить идентификатор документа из документа транспортного средства, даже если интерфейс транспортного средствавключает в себя поле «клиент». (см. изображение ниже) Вот почему я не заполнил этот фрагмент, чтобы вернуть гранулярные значения для добавления к наблюдаемой «машине».

enter image description here

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

...