簡體   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