使用AngularFire2,如何在包含其他Observable的ObservableList中转换数据

时间:2016-09-17 15:17:54

标签: rxjs angularfire2 angular2-observables

我对此有点新意,请耐心等待。我会尽力解释。我正在使用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,但最终会给我一个可观察的单个对象,而不是包含对象的可观察数组。

0 个答案:

没有答案