我对此有点新意,请耐心等待。我会尽力解释。我正在使用AngularFire2和retrieving data as a list。在我的情况下,我正在尝试获取与帐户关联的交易列表(请参阅下面的示例数据)。
示例数据
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]
然后我想用Transactions节点中的实际事务详细信息完全替换这两个对象。所以像这样:
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,但最终会给我一个可观察的单个对象,而不是包含对象的可观察数组。