FirebaseListObservable

FirebaseListObservable

如另一个问题所述,我正在使用Firebase作为后端开发Ionic 2 App。

我有类别,我有产品。产品属于类别。由于是“ n对m”的关系,因此产品和类别存储在Firebase的单独节点中。我的数据结构如下:

Firebase data structure:

类别知道哪些产品属于它们(密钥在每个类别的“产品”节点中引用)。产品知道它们属于哪个类别(键在“ prod_cat”节点中引用)。
但是,当我列出所有类别时,我只知道属于该类别的产品的ID。在模板中,我需要显示更多详细信息,例如产品名称。

我阅读了许多类似的问题,并提出了此解决方案,以将产品信息添加到类别中:

getProductsOfCategory(catId){
  this.productsOfCategory = this.af.database.list('/categories/'+catId+'/prods');

  return this.productsOfCategory
    .map(products => {
      console.log(products); // works fine: an object containing the relevant product information is logged to the console (see screenshot)
      products.map( product => { console.log(product.$key); // works fine: the IDs of the products are logged to the console
        product.prod_details = this.af.database.object('/products/'+product.$key); // seems not to work. Returned value: undefined
      });
    });


不幸的是,这不起作用。
正如代码中的注释所示,产品信息已正确收集并记录到控制台(请参见以下屏幕截图):
console screenshot

但是,上述函数的返回对象是“未定义”。

当我尝试声明状态时,将明确返回FirebaseListObservable类型的对象,我收到错误消息:


  无法将类型“可观察”分配给类型“ FirebaseListObservable”。
    类型“可观察”中缺少属性“ $ ref”。


有人知道我还能尝试什么吗?

提前非常感谢您!

最佳答案

我解决了问题。
提供者(* .ts):

getProductsOfCategory(catId){
  let result = this.af.database.list('/categories/'+catId+'/prods')
    .map(items => {
      for (let product of items) {
        this.af.database.object('/products/'+product.$key)
        .subscribe( data => {
          product.details = data;
        });
      }
      return items;
    })
  return result;
}


getCategoriesAndProducts(){
  let result = this.af.database.list('/categories')
    .map(items => {
      for (let category of items) {
        this.getProductsOfCategory(category.$key)
        .subscribe(data => {
          category.productDetails = data;
        })
      }
      return items;
    })
  return result;
}

模板ts文件中的提供者调用:
getCategoriesAndProducts(){
    this.categoryService.getCategoriesAndProducts()
      .subscribe(data => {
          this.categoriesAndProducts = data;
});

模板/视图(* .html):
<ng-container *ngFor="let cat of categories">
  <ng-container *ngIf="cat.parent_cat === 'noParentCategory'">
    <h3>
      {{cat.cat_name}}
    </h3>
    <ng-container *ngFor="let subcat of categoriesAndProducts">
      <ion-list>
        <ng-container *ngIf="subcat.parent_cat === cat.$key">
          <ion-item-divider>
            {{subcat.cat_name}}
          </ion-item-divider>
          <ion-item *ngFor="let prod of subcat.productDetails">
            {{prod.details?.prod_name}}
          </ion-item>
        </ng-container>
      </ion-list>
    </ng-container>
  </ng-container>
</ng-container>

09-06 21:07