AngularFire2:使用 RxJS .map() 在 FirebaseListObservables 上执行“连接”

2023-12-03

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

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

Firebase 数据结构:

类别知道哪些产品属于它们(键在每个类别的“prods”节点中引用)。产品知道它们属于哪些类别(键在“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
      });
    });

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

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

当我尝试明确声明要返回 Firebase List Observable 类型的对象时,我收到错误:

类型“Observable”不可分配给类型“FirebaseListObservable”。 “Observable”类型中缺少属性“$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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularFire2:使用 RxJS .map() 在 FirebaseListObservables 上执行“连接” 的相关文章

随机推荐

  • 使用 GROUP SEPARATOR 的 Explode() 函数

    根据发现通过MySQL GROUP CONCAT 转义这个我有用GROUP CONCAT SELECT topic response response GROUP CONCAT comment SEPARATOR 0x1D AS comme
  • 你能用 javascript (jxa) 编写文件夹操作吗?

    我正在寻找 AppleScript 的直接翻译 on adding folder items to this folder 但我似乎无法在任何地方找到它 无论是术语的用法还是关键字 this folder 本身 使用 Automator 我
  • 在引导输入字段中放置清除按钮

    我试图在输入字段内 搜索图标之前的右侧放置一个清除按钮 但它不起作用 x 显示在输入字段的前面 我使用绝对定位 right 0 和 top 4px 您可以在这里查看我的示例 http www bootply com YUwdJ5Kvx6 一
  • Delphi Windows 服务设计

    Delphi Windows 服务设计 我从未创建过 Windows 服务 但一直在阅读我发现的所有内容 我遇到的所有文章或示例在实现上都非常基础 并且范围有限 还没有看到任何超出此范围或解决特定场景的内容 所以 我已经掌握了我可能会找到的
  • jQuery 的“uploadProgress”未在“$.ajax”中触发

    我是 jQuery 新手 现在正在处理文件上传 我想在每次上传图像时添加一些进度条 我用的是uploadProgress在 jQuery 中 但它似乎不起作用 这是我的代码 form on submit function e var fil
  • Progress 元素内的 html 文本

    您好 有人可以帮我处理这个进度 html 元素吗 我需要能够在进度的右侧放置一个文本值 并根据进度是否减少文本来配合该元素 progress webkit appearance none progress webkit progress b
  • 在 OleDbCommand 中使用“... where Column like ...”不起作用

    我正在使用 C 从 Access 我认为是 2003 或 2007 数据库中选择某些内容 但它没有选择任何内容 我在 Access 本身中尝试了 SQL 语法 它似乎工作正常 我对 C 和 Access 相当陌生 到目前为止我所拥有的 Ol
  • Jquery 从脚本标签获取文本时出现问题?

    我有这个小 HTML 文档
  • 在 Windows 10 中批量运行 VBS 脚本时解压缩文件错误

    运行VBS时解压码在 Win 10 中执行批处理 出现以下错误 鉴于其他人之前曾报告过它可以工作 这可能是什么原因 更改目标目录或显式设置它们不会影响该错误 echo off setlocal enabledelayedexpansion
  • python:直接编辑ISO文件

    是否可以获取 ISO 文件并直接编辑其中的文件 即不解压 更改文件并重新打包 1 可以用Python来做吗 我该怎么做呢 您可以用于列出和提取 我测试了第一个 https github com barneygale iso9660 blob
  • 为 Sklearn 重塑数据

    我有一个颜色列表 initialColors u black u black u black u white u white u white u powderblue u whitesmoke u black u cornflowerblu
  • 角度 $watch |从函数返回项目

    我很想知道为什么我总是必须这样做 scope watch function return scope someData function value console log value 为了让 Angular 真正观察数据 为什么我必须这样
  • Web 配置文件中的 Windows 模拟代码错误

    我在 Web 配置文件中声明了以下部分以允许模拟 我已将该文件夹共享给另一台计算机上的网络内的公共访问
  • 使用 *args、**kwargs 和可选/默认参数调用 Python 函数

    在Python中我可以定义一个函数如下 def func kw1 None kw2 None kwargs 在这种情况下 我可以打电话func as func kw1 3 kw2 4 who knows if this will be us
  • Twitter 未捕获类型错误:未定义不是函数

    我已将 Twitter 小部件使用中遇到的错误范围缩小到事件绑定 twttr events bind tweet function event addShared or twttr events bind tweet addShared 似
  • 将 IE 浏览器与 Visual Basic 结合使用

    正在努力寻找解决这个问题的方法 从 Visual Basic 更具体地说是 Excel 中的 VBA 中 我可以使用以下命令按标题调用 Internet Explorer 窗口 AppActivate My Page Title Windo
  • vscode 扩展 - 如何记录击键

    我正在做用户测试vscode extension 对于某些大学项目 我需要获取文本编辑器中按下的按键的日志 我尝试过onDidChangeTextDocument 但这不会捕获不修改文档的击键 例如 Ctrl 或 Alt 我还尝试向活动文本
  • 使用 Chart.jscanvases 将 HTML 内容导出为 PDF

    我有一个 HTML 页面 其中包含由 Chart js 生成的大约 10 个图表 因此这些是画布元素 我希望能够将页面内容导出到 PDF 文件中 我尝试过使用jsPDF的 fromHTML函数 但它似乎不支持导出画布内容 要么是我做错了 我
  • 使用 Google Apps 脚本插入 YouTube 顶级评论

    我正在尝试使用 Google Apps 脚本创建一个程序 该程序会在某个 YouTube 频道上传时插入评论 我已经能够从频道获取最新的 YouTube 视频 ID 但是当我尝试插入评论时 它会抛出错误 解析错误 第 19 行 文件 代码
  • AngularFire2:使用 RxJS .map() 在 FirebaseListObservables 上执行“连接”

    正如另一个问题所述 我正在开发一个使用 Firebase 作为后端的 Ionic 2 应用程序 我有类别 我有产品 产品属于类别 由于它是 n 到 m 的关系 因此产品和类别存储在 firebase 中的单独节点中 我将数据结构化如下 Fi