46

最近,ngrx store 改变了在 Angular 应用程序中注册存储变量的方式。

StoreModule.forRoot() 和 StoreModule.forFeature() 有什么区别

我们是否需要同时注册两者才能使应用程序正常工作?

4

4 回答 4

32

它与延迟加载的减速器一起使用。当您拥有(延迟加载的)功能模块并且想要在该模块中注册减速器时,您可以使用forFeature. 否则,在您AppModule使用forRoot.

于 2017-09-21T16:04:45.660 回答
12

总是 Import forRoot() 调用 我认为这可能很明显,但为了记录,您需要确保您已经在主应用程序中导入了根存储和效果模块。

imports: [
    StoreModule.forRoot({}),
    EffectsModule.forRoot([]),
    ...

如果您有适用于此级别的减速器或效果,您应该在此处添加它们,但即使您的应用程序的根级别没有任何减速器或效果,您也需要进行这两个调用。否则,forFeature() 调用将无法访问根存储或效果位置以添加该功能的减速器和效果。

于 2017-09-25T22:02:28.227 回答
10

首先,为了轻松处理 Angular 模块,您必须了解一些基本术语,以帮助您在未来解决类似的问题。

Angular 应用程序(基本上)由一个名为“AppModule”的模块组成,通常称为根模块:这是应用程序的主模块,在main.ts文件中引导的一个模块,实际上是应用程序条目观点。当您将一些外部模块导入 AppModule 的导入数组时,您通常会调用静态方法forRoot为该模块提供初始配置:StoreModule 的 forRoot 方法就是这种情况,您可以设置商店的初始配置。

您可以开发您的应用程序,找到一些“关注区域”来解决问题的特定部分。当您将组件、指令、服务和其他 Angular 元素合并到一个模块中时,该模块将成为一个功能模块,因为正如命名约定所暗示的那样,它为您的应用程序提供了一个功能。无论您如何加载模块(Eagerly 或 Lazily),它始终是一个功能模块。

现在,也许您已经自己回答了您的问题:

  1. forRoot方法在AppModule 中调用,通常在应用程序中调用一次以初始化 Store 并提供初始 reducers/actions/state 配置。如果你使用 EffectsModule,你也会在这个模块上调用 forRoot 方法:

    @ngModule({ 导入:[ StoreModule.forRoot(), EffectsModule.forRoot() ] }) 类 AppModule {}

  2. 在任何需要它自己的状态管理部分的功能模块中调用forFeature方法:例如,UserModule 将定义它自己的状态部分,描述所需的操作、reducer 等。如果您使用 EffectsModule,请记住也针对它调用 forFeature 方法。正如您自己可能已经理解的那样,对于应用程序中的同一个导入模块,可以多次调用forFeature(作为更通用的 Angular 的forChild方法):

    AppModule -> StoreModule.forRoot(...) UsersModule -> StoreModule.forFeature(...) OtherModule -> StoreModule.forFeature(...)

最后,请记住 forRoot 和 forFeature 签名彼此略有不同:事实上,后者具有描述特征名称的第一个参数。如果我没记错的话,其他参数与 forRoot 方法相同。如果您尝试使用 @ngrx/schematics 包使用以下命令为功能模块生成样板:

ng generate feature user/User -m modules/users/users.module.ts --group

您会发现功能名称只是给定命令中User单词的小写版本: user

于 2021-01-13T19:16:37.843 回答
2

在 Angular 项目中,您可以使用功能模块将应用程序划分为重点区域,因此很自然地将该功能存储在其自己的模块中StoreModule.forFeature(),然后在主应用程序模块中导入该模块。您应该记住,StoreModule.forRoot()即使您已经模块化了整个应用程序,主模块也应该有StoreModule.forRoot({})一个空对象,因此当您导入功能模块时,它将将该模块的状态附加到您的状态。

注意:延迟加载模块是一种功能模块,因此您可以使用它 StoreModule.forFeature() 来设置应用程序该部分的状态。

于 2020-10-15T14:43:28.203 回答