繁体   English   中英

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

[英]What is the difference between StoreModule.forRoot() and StoreModule.forFeature()

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

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

我们是否需要同时注册两者才能使应用程序运行?

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

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

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

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

首先,为了轻松处理 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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM