Angularfire2 如何使用 AngularFireList 检索一项

Angularfire2 How to use AngularFireList to retrieve one item

在我使用 angularfire2 的 angular 应用程序中,我有获取和存储订单集合的服务。我将它们存储在 AngularFireList 中并使用以下方法获取它们:

db.list('items').valueChanges();

但是,在我的组件中,我需要从另一个位置获取订单和客户数据,我已经设法做到了,但是我在我的服务中使用另一个 Observable 变量来存储连接的数据 - 是否需要设计服务中的两个集合存储了部分相同的数据(纯订单数据对我来说似乎是重复的)?

第二个问题,如何从我的服务中的订单集合(AngularFireList 类型)中只获取一个订单?我不想发出另一个请求,因为我已经在服务中获取了所有数据,但是当我尝试发出:

valueChange().pipe(filter(order => { order.id == desiredId };), first()) 

我收到 observable,它解析为仅包含值的数组,没有键。 如何管理?

如果有一些设计模式可以解决这种情况,我想知道它们。

1) - 是的,这是设计使然,您有流 (Observable),您可以根据需要组合它们以获得所需的行为,目标是正确组合它们以避免意外行为。

例如,当服务触发订阅后端并且您不希望这样时,您可以将 shareReplay(1) 添加到 return 最新的已知值而不是实际请求。

2) 您需要稍微更改一下代码。

sharedValueChange$ = valueChange().pipe(
  shareReplay(1),
);

// now these 2 will trigger only one valueChange() and share its emits.

allOrderChanges$ = sharedValueChange$.pipe(
  // some logic without a filter
);

desiredOrderChanges$ = sharedValueChange$.pipe(
  filter(order => order.id === desiredId),
  // first(), // if you don't want to receive its updates anymore.
);

desiredOrderChanges$.subscribe(); // doesn't trigger an extra time valueChange() 
desiredOrderChanges$.subscribe(); // doesn't trigger an extra time valueChange() 
desiredOrderChanges$.subscribe(); // doesn't trigger an extra time valueChange() 

3) 要调试解决请在 filter 之后添加 tap(console.log) 并将输出放入您的问题中。