4

我对此有点陌生,所以请耐心等待。我会尽力解释。我正在使用 AngularFire2 并将数据作为列表检索。就我而言,我正在尝试获取与帐户关联的交易列表(请参阅下面的示例数据)。

样本数据

accounts: {
  account1: {
    name: "Account 1",
    transactions: {
      transaction1: {
        date: somedate
      },
      transaction2: {
        date: somedate
      }
    }
  }
}

transactions: {
  transaction1: {
    name: "Transaction 1"
  },
  transaction2: {
    name: "Transaction 2"
  },
  transaction3: {
    name: "Transaction 3"
  }
}

我的第一步是从账户中获取交易列表:

af.database.list('/accounts/account1/transactions');

这给了我一个可观察的对象数组,如下所示:

[Object, Object]

然后我想用交易节点的实际交易细节完全替换这两个对象。所以是这样的:

af.database.list('/accounts/account1/transactions')
.map(res => {
  return res.map(items => {
    return af.database.list('/transactions/items.$key');
  })
})

这种排序让我得到了我想要的,除了我现在有一个可观察的可观察数组而不是像这样的对象:

[Observable, Observable]

只要我像这样使用 async 和 Elvis 运算符,我就可以让它在我的模板中工作:

<ul>
  <li *ngFor="let transaction of transactions | async">{{ (transaction | async)?.name }}</li>
</ul>

我还需要将帐户名称作为每个对象或可观察对象的一部分,因此我最终将其更改为如下内容:

af.database.list('/accounts/account1/transactions')
.map(res => {
  return res.map(transaction => {
    transaction.details = af.database.list('/transactions/' + transaction.$key);
    transaction.account = af.database.list('/accounts/' + accountKey);
  })
})

好的,所以这确实有效,但现在我想转换这些数据,以便我的服务返回更简洁的内容。您在下面的示例数据中看不到的是,交易和账户中的每一个都有更多的数据点。我不需要也不想要响应中的那些,所以我想稍微清理一下。最后,我想用一个可观察的对象数组来响应,就像最初的 angularfire2 调用一样。现在我有一个可观察的对象数组,如下所示:

{
  date: somedate,
  details: Observable,
  account: Observable
}

我真的很想拥有更多这样的东西:

{
  date: somedate,
  name: "Transaction 1",
  accountName: "Account 1"
}

因此,我需要弄清楚如何从这些可观察值中获取值,并且我正用头撞墙试图弄清楚。有人有什么建议吗?我确定我在这里遗漏了一些简单的东西。

我发现的大多数解决方案都建议使用 flatMap 或 concatMap,但这最终给了我一个可观察的单个对象,而不是一个包含对象的可观察数组。

4

0 回答 0