只有一个减速器的NGRX的多个存储

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了只有一个减速器的NGRX的多个存储相关的知识,希望对你有一定的参考价值。

我知道它是asked,但尚未直接回答。我希望获得2个以上具有相同reducer / effects / selector / actions的商店。

基本上,我在页面上并排显示一些数据,两者的行为完全相同。

[我知道,我可以做2个功能,side1side2,但是然后我将不得不复制所有选择器,所有动作,所有效果,所有变径器;否则它们将彼此碰撞。

避免代码重复的最佳方法是什么?假设我必须调整所有代码以接受我所有操作的side参数,这将是一个耻辱。

答案

长话短说-不,没有一种简单的方法。

为此,您需要确保模块不具有导入StoreModule.forRoot的父类(如AppModule)。然后,您可以在每个模块中导入StoreModule.forRoot,它将为每个节点创建单独的存储,但是在这种情况下,您无法访问其他存储的数据。

如果您想拥有一个商店,但要以相同的动作来影响不同的功能,则需要为所有动作,化简器和效果实施correlationId模式,以确保它们不会造成彼此的数据冲突。

也可以像ngrx/data一样做-通过服务而不是actionsselectors访问存储,然后对于每个模块来说都是这样

@Injectable()
export class UserSelectorService implements OnInit {
    constructor(
        protected serviceFactory: EntityCollectionServiceFactory,
    ) {
    }

    public readonly users = this.serviceFactory.create('users');
    public readonly data$ = this.users.selectAll();

   ngOnInit() {
     this.users.load();
   }
}

以上是关于只有一个减速器的NGRX的多个存储的主要内容,如果未能解决你的问题,请参考以下文章

Ngrx - 减速器无法接收动作

我无法在 app.module 中为 ngrx 注册我的减速器

在 @ngrx/store 4.0 中提供 root reducer

如何通过 Angular 中的 NGRX 减速器使用数组更新状态?

NGRX 效果看不到商店中的完整状态

如何清除#ngrx 中的状态?