我用Angular和NgRx 13定义了一个存储库。我有一个SharedModule,其中定义了选择器等组件。每个选择器内容都加载在store中,这样就可以避免重复调用API。

这方面的定义如下:
shared.module.ts
/**...*/
StoreModule.forFeature(clientsFeature),
StoreModule.forFeature(prioritiesFeature),
/**...*/clients.feature.ts
import { createFeature, createSelector, createReducer, on } from '@ngrx/store';
import { ClientDTO } from '@shared/model/client.models';
import * as ClientsActions from './clients.actions';
export const initialState: ClientDTO[] = [];
export const clientsFeature = createFeature({
name: 'clients',
reducer: createReducer(
initialState,
on(ClientsActions.getClientListSuccess, (state, { clients }): ClientDTO[] => clients)
),
});
export const selectClientList = createSelector(clientsFeature.selectClientsState, clients => clients);优先次序的特点是相似的。
我要做的是避免声明每个特性,并使用包含所有子功能的“共享”功能。为此,我创建:
index.ts
import { ActionReducerMap } from '@ngrx/store';
import { ClientDTO } from '@shared/model/client.models';
import { Priority } from '@shared/model/priorities.models';
import { clientsFeature } from './clients/clients.reducer';
import { prioritiesFeature } from './priorities/priorities.reducer';
export const sharedFeatureKey = 'shared';
export interface SharedState {
clients: ClientDTO[] | null;
priorities: Priority[] | null;
}
export const reducers: ActionReducerMap<SharedState> = {
clients: clientsFeature.reducer,
priorities: prioritiesFeature.reducer,
};我的shared.module:
StoreModule.forFeature(fromShared.sharedFeatureKey, fromShared.reducers),

一切都好。
问题
为此,我无法访问列表的内容。我肯定我错过了什么,但我不知道是什么。我收到警告:
ngrx-store.mjs:724 @ngrx/store:状态中不存在“客户端”特性名,因此createFeatureSelector无法访问它。确保它是使用StoreModule.forRoot('clients',.)在加载模块中导入的或StoreModule.forFeature(“客户”,.)如果默认状态是未定义的,如路由器状态,则只能忽略此开发警告消息。
还有另一种类似的优先事项。我很确定问题在选择器中,但经过几个小时的尝试,我无法找到解决方案。
未定义的是选择器内容的日志:
this.store
.select(selectPrioritiesList)
.pipe(take(1))
.subscribe(priorities => {
console.log('priorities -->', priorities);
});

我做错什么了?提前感谢
发布于 2022-04-26 10:35:01
问题在于选择器。因为您添加了额外的“共享”层,所以需要更新选择器。
目前,createFeature是不可配置的,并且使用顶层状态来选择子状态.这意味着您不能使用createFeature提供的选择器,但是您必须手动编写选择器。
https://stackoverflow.com/questions/72002571
复制相似问题