Как создать наблюдаемую в наблюдаемой в AngularFire Infinite Scroll - PullRequest
0 голосов
/ 20 июня 2019

Я успешно реализовал Бесконечную прокрутку AngularFire , используя бесконечную прокрутку Ionic 4 вместо CDK.

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

Мне кажется, что у меня есть несколько способов сделать это, если я просто отображаю данные в"нормальный" способ AngularFire, но этот код Infinite Scroll немного выше моей головы.

Я попытался создать наблюдаемое внутри метода getBatch.Вот оригинал:

getBatch(offset) {
    return this.db
      .collection('post', ref =>
        ref
          .orderBy('postCount', 'desc')
          .startAt(offset)
          .limit(this.batch)
      )
      .snapshotChanges()
      .pipe(
        tap(arr => (arr.length ? null : (this.theEnd = true))),
        map(arr => {
          return arr.reduce((acc, cur) => {
            const id = cur.payload.doc.id;
            const data = cur.payload.doc.data();
            return { ...acc, [id]: data };
          }, {});
        })
      );
  }

и моя попытка:

getBatch(offset) {
    return this.db
      .collection('post', ref =>
        ref
          .orderBy('postCount', 'desc')
          .startAt(offset)
          .limit(this.batch)
      )
      .snapshotChanges()
      .pipe(
        tap(arr => (arr.length ? null : (this.theEnd = true))),
        map(arr => {
          return arr.reduce((acc, cur) => {
            const id = cur.payload.doc.id;
            const data = cur.payload.doc.data() as Post;

            const productid = (cur.payload.doc.data() as Post).productID;

            if (productid != undefined) {
              this.isProduct = true;
              this.afs.collection('product').doc(productid).valueChanges().subscribe(value => {
                this.productList = value;
                console.log(value);
                return;
              });
            };

            return { ...acc, [id]: data };
          }, {});
        })
      );
  }

В моем шаблоне:

<p>{{ product?.description }}</p>

внутри бесконечного свитка, конечно:

  <div *ngIf="infinite | async as postList">
    <div *ngFor="let post of postList; let i = index; trackBy: trackByIdx">

Когда я делаю это, консоль отображает информацию о продукте для каждого из продуктов в соответствии с соответствующим сообщением - как я и ожидал.И самый первый пост отображает описание продукта, связанного с ним, и это здорово.Проблема в том, что каждое сообщение после этого также отображает одно и то же описание, независимо от того, имел ли этот пост даже продукт, связанный с ним.

Будем весьма благодарны за любые рекомендации по отображению этого сообщения!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...