具有多个相关实体的 ngrx `forFeature`
ngrx `forFeature` with multiple related entities
我们正在尝试为我们的应用采用 forFeature
模式。然而,多个功能是相关的。
我们有一个同时显示多个实体关系的应用程序。
例如考虑我们有以下实体
- 产品
- 供应商
- 国家
- 货币
- 港口
哪里是模特
ìnterface Product {
countryId: string;
currencyId: string;
supplierId: string;
}
interface Supplier {
name: string;
harbourId: string;
countryId: string;
}
然后在 product-detail
页面中,我们显示产品的 currency
和 country
以及 supplier
的名称和 country
。
考虑一下我们还有一个 supplier-details page
,我们在其中显示上述供应商信息及其最后 10 个产品。
当前处理所有这些的方式是使用这样的存储结构:
- entities
---- product
---- supplier
---- currency
---- country
---- harbour
- ui
---- other stuff ui related
这是通过根目录下的单个商店完成的。
然而app文件夹结构是这样划分的:
- features
--- product
------ product.actions / product.reducer / product.effects / product.selector
--- supplier
------ supplier.actions / supplier.reducer / supplier.effects / supplier.selector
--- store
------ reducers ( here we are importing all reducers to combine those)
------ harbour.actions / harbour.reducer / harbour.effects / harbour.selector
------ country.actions / country.reducer / country.effects / country.selector
------ currency.actions / currency.reducer / currency.effects / currency.selector
如您所见,文件夹结构有点混乱,因为我还不确定将 harbour
、country
和 currency
放在哪里,因为其中一些很友好一般实体。
不过,我正在查看 ngrx
的 forFeature
位,我想知道如果我们碰巧使用它,以及是否可以一起使用这些功能,所有这些将如何组合在一起。
- 这些实体中的每一个都是
forFeature
吗?
- 还是应该将所有这些东西放在一个地方并具有
entity
功能,以便我的商店看起来与现在一样?
forFeature
用于需要以惰性方式注册的减速器,与 forRoot
.
相比,forChild
我认为对此的经验法则是:
如果只有特定的 lazy-loaded 模块需要减速器,那么它应该是该模块的 forFeature
,这样它只会在加载该模块后被注册。
一旦 reducer 需要跨模块共享(延迟加载或不延迟加载),那么它需要在您的应用程序中处于更高的抽象级别,并且应该转到 forRoot
版本(全球可访问 "at startup")
总而言之:
- 我觉得你的实体结构没问题。
- 我会把 harbour/country/currency 与你对文件结构所做的类似。
- 仅在
forFeature
中仅使用该功能模块需要的状态片,并且该模块是 lazy loaded
。
我们正在尝试为我们的应用采用 forFeature
模式。然而,多个功能是相关的。
我们有一个同时显示多个实体关系的应用程序。
例如考虑我们有以下实体
- 产品
- 供应商
- 国家
- 货币
- 港口
哪里是模特
ìnterface Product {
countryId: string;
currencyId: string;
supplierId: string;
}
interface Supplier {
name: string;
harbourId: string;
countryId: string;
}
然后在 product-detail
页面中,我们显示产品的 currency
和 country
以及 supplier
的名称和 country
。
考虑一下我们还有一个 supplier-details page
,我们在其中显示上述供应商信息及其最后 10 个产品。
当前处理所有这些的方式是使用这样的存储结构:
- entities
---- product
---- supplier
---- currency
---- country
---- harbour
- ui
---- other stuff ui related
这是通过根目录下的单个商店完成的。
然而app文件夹结构是这样划分的:
- features
--- product
------ product.actions / product.reducer / product.effects / product.selector
--- supplier
------ supplier.actions / supplier.reducer / supplier.effects / supplier.selector
--- store
------ reducers ( here we are importing all reducers to combine those)
------ harbour.actions / harbour.reducer / harbour.effects / harbour.selector
------ country.actions / country.reducer / country.effects / country.selector
------ currency.actions / currency.reducer / currency.effects / currency.selector
如您所见,文件夹结构有点混乱,因为我还不确定将 harbour
、country
和 currency
放在哪里,因为其中一些很友好一般实体。
不过,我正在查看 ngrx
的 forFeature
位,我想知道如果我们碰巧使用它,以及是否可以一起使用这些功能,所有这些将如何组合在一起。
- 这些实体中的每一个都是
forFeature
吗? - 还是应该将所有这些东西放在一个地方并具有
entity
功能,以便我的商店看起来与现在一样?
forFeature
用于需要以惰性方式注册的减速器,与 forRoot
.
forChild
我认为对此的经验法则是:
如果只有特定的 lazy-loaded 模块需要减速器,那么它应该是该模块的 forFeature
,这样它只会在加载该模块后被注册。
一旦 reducer 需要跨模块共享(延迟加载或不延迟加载),那么它需要在您的应用程序中处于更高的抽象级别,并且应该转到 forRoot
版本(全球可访问 "at startup")
总而言之:
- 我觉得你的实体结构没问题。
- 我会把 harbour/country/currency 与你对文件结构所做的类似。
- 仅在
forFeature
中仅使用该功能模块需要的状态片,并且该模块是lazy loaded
。