angular - 使用 angularfire2 时要在 ngrx/store 中存储什么?

标签 angular firebase redux angularfire2 ngrx

我开始学习 angular2 并开始学习 ngrx/store(以前没有使用 redux 的 exp)和 firebase 应用程序。现在,我不知道如何在商店中存储 firebase 对象、数组和其他东西。我是否应该按原样放置它们,例如,将这个 FirebaseListObservable 放在商店 af.database.list('/items') 中?它看起来很合适(组件可以只执行 store.select('items') 并且模板可以订阅它,并且对于突变我仍然可以将事件触发到商店,在那里我会用 reducer 改变列表)但我的猜测是不是因为这个列表可以从商店外改变(一些其他订阅相同列表的应用程序用户)。还是应该视具体情况而定?

如果不是,我应该在哪里存储对该 firebase 对象的引用以及我应该在商店中放入什么?

最佳答案

recommended只应将可序列化的内容放入商店:

It is highly recommended that you only put plain serializable objects, arrays, and primitives into your store. It's technically possible to insert non-serializable items into the store, but doing so can break the ability to persist and rehydrate the contents of a store, as well as interfere with time-travel debugging.

AngularFire2 observable 的异步特性意味着您可能希望使用 @ngrx/effects 来集成它们. Effects 本质上是监听一个特定的 Action ,执行一些(可能是异步的)副作用,然后(通常)发出另一个 Action 。

你如何做取决于你想做什么。

例如,如果您希望使用 FirebaseListObservable 执行查询,您可以使用典型的 READ_ITEMSREAD_ITEMS_SUCCESSREAD_ITEMS_ERROR 像这样的 Action 和效果:

@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: [] })
  );

请注意,第二个效果不监听 Action 。相反,它响应身份验证状态,并在用户通过身份验证等后发出 REFRESH_ITEMS 操作。

在这两种情况下,受影响的操作都将包含一组项目的有效负载 - 可以由缩减器处理以存储在商店中。

关于angular - 使用 angularfire2 时要在 ngrx/store 中存储什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43033660/

相关文章:

javascript - 如何将来自 setInterval 的数据推送到数组中

javascript - 如何计算点击可拖动 Canvas 元素的位置?

angular - 如何使用 Visual Studio Code 中的 Electron 和 Angular 调试应用程序?

angular - 将 Angular 从 9 升级到 10 错误 : Package '-e' is not a dependency

android - Firebase,从大量数据中查询特定键

android - Android 4.4 上的 Firebase 托管 SSL 握手异常

firebase - 如何同步 Firestore 规则和索引?

html - 如何防止元素文本换行

Angular2 选择器不匹配嵌套组件中的任何元素

reactjs - 在 React Redux 应用程序中规范化状态的示例是什么?