【问题标题】:What to store in ngrx/store when using angularfire2?使用 angularfire2 时在 ngrx/store 中存储什么?
【发布时间】:2017-08-19 09:47:54
【问题描述】:

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

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

【问题讨论】:

    标签: angular firebase redux angularfire2 ngrx


    【解决方案1】:

    只有recommended才应该将可序列化的内容放入store:

    强烈建议您只将普通的可序列化对象、数组和原语放入您的存储中。 技术上可以将不可序列化的项目插入到 store 中,但这样做会破坏持久化和重新水化 store 内容的能力,并干扰时间旅行调试。

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

    如何做到这一点取决于你想做什么。

    例如,如果您希望使用FirebaseListObservable 执行查询,则可以使用典型的READ_ITEMSREAD_ITEMS_SUCCESSREAD_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 处理以存储在存储中。

    【讨论】:

    • 所以如果我不关心时间旅行调试和持久性,我可以将 FirebaseListObservable 存储在存储中。如果我关心那些东西并想按书去做,我应该使用效果。基本上,它归结为了解您的确切用例并做一些感觉更自然的事情?
    • 你可以为所欲为,是的。但是,时间旅行调试和 Redux DevTools(与 @ngrx/store 一起使用 - 请参阅 @ngrx/store-devtools)非常有用。就个人而言,我认为将 observables 放入 store 有点奇怪,因为它们实际上并不包含状态,可以这么说。这有点像把从其他地方返回状态的函数放入存储中。但如果你想做,就去做。另外,请记住这样做是否会使您的测试更容易或更难。
    • 我担心的是来自 angularfire2 的 Firebase 对象已经是可观察的,并提供与云中数据库的 2 路同步,这真的很简洁。对我来说,将这些对象与商店分离(仅在商店中存储基本类型)似乎是双重工作(我将商店与 firebase 对象同步,而 firebase 对象与云同步)。直觉上我担心我会破坏商店和firebase列表中列表的一致性。但是,这是尝试两种方式并进行测试的良好开端。
    • 这就是我最终登陆这个线程的确切原因。现在在前端复制状态有什么好处,因为 firebase 几乎可以让您始终保持同步?
    • @dreamerkumar 看看youtube.com/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2019-12-16
    • 2018-04-25
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多