只有recommended才应该将可序列化的内容放入store:
强烈建议您只将普通的可序列化对象、数组和原语放入您的存储中。 技术上可以将不可序列化的项目插入到 store 中,但这样做会破坏持久化和重新水化 store 内容的能力,并干扰时间旅行调试。
AngularFire2 可观察对象的异步特性意味着您可能希望使用 @ngrx/effects 集成它们。效果本质上是监听一个特定的动作,执行一些(可能是异步的)副作用,然后(通常)发出另一个动作。
如何做到这一点取决于你想做什么。
例如,如果您希望使用FirebaseListObservable 执行查询,则可以使用典型的READ_ITEMS、READ_ITEMS_SUCCESS 和READ_ITEMS_ERROR 操作和如下效果:
@Effect()
readItems$ = this.actions$
.ofType('READ_ITEMS')
.switchMap(() => this.af.database
.list('/items')
.first()
.map(items => ({ type: 'READ_ITEMS_SUCCESS', payload: items }))
.catch(() => Observable.of({ type: 'READ_ITEMS_ERROR', payload: error.toString() }))
);
但是,如果您想收听来自 FirebaseListObservable 的实时更改,您可以执行以下操作:
@Effect()
refreshItems$ = this.af.auth
.switchMap((authState) => authState ?
this.af.database
.list('/items')
.map(items => ({ type: 'REFRESH_ITEMS', payload: items })) :
Observable.of({ type: 'REFRESH_ITEMS', payload: [] })
);
请注意,第二个效果不监听动作。相反,它会响应身份验证状态,并在用户通过身份验证后发出 REFRESH_ITEMS 操作等。
在这两种情况下,受影响的操作都将包含一组项目的有效负载 - 可以由 reducer 处理以存储在存储中。