Angular 角度NgRx选择器返回未定义的

Angular 角度NgRx选择器返回未定义的,angular,rxjs,observable,ngrx,rxjs6,Angular,Rxjs,Observable,Ngrx,Rxjs6,这是我的app.state.ts export interface AppState { getCards: Card[]; getFlippedCards: Card[]; currentPlayer: boolean; firstPlayerScore: number; secondPlayerScore: number; flipped: boolean; error: string; } export const initialState: AppState

这是我的app.state.ts

export interface AppState {
  getCards: Card[];
  getFlippedCards: Card[];
  currentPlayer: boolean;
  firstPlayerScore: number;
  secondPlayerScore: number;
  flipped: boolean;
  error: string;
}
export const initialState: AppState = {
  getCards: [],
  getFlippedCards: [],
  currentPlayer: false,
  firstPlayerScore: 0,
  secondPlayerScore: 0,
  flipped: false,
  error: '',
};
const appState = (State: AppState) => State;


export const getCards = createSelector(appState, (state) => state.getCards);
export const getFlippedCards = createSelector(
  appState,
  (state) => state.getFlippedCards
);
export const currentPlayer = createSelector(
  appState,
  (state) => state.currentPlayer
);
export const firstPlayerScore = createSelector(
  appState,
  (state) => state.firstPlayerScore
);
export const secondPlayerScore = createSelector(
  appState,
  (state) => state.secondPlayerScore
);
export const flipped = createSelector(appState, (state) => state.flipped);
export const error = createSelector(appState, (state) => state.error);
app.module.ts:

imports: [
    BrowserModule,
    AppRoutingModule,
    StoreModule.forRoot({ AppReducer }),
  ],
app.ts

export function AppReducer(state = initialState, action: AppActions): AppState {
  switch (action.type) {
    case ActionTypes.Load:
      return { ...state, getCards: action.payload };
    case ActionTypes.ToggleFlip:
....
app.actions.ts

export enum ActionTypes {
  Load = 'Load Cards',
  ToggleFlip = 'Flip a Card',
}
export class ToggleFlip implements Action {
  readonly type = ActionTypes.ToggleFlip;
  constructor(public payload: Card) {}
}
export class Load implements Action {
  readonly type = ActionTypes.Load;
  constructor(public payload: Card[]) {
    console.log('load app.actions ', payload);
  }
}
export type AppActions = ToggleFlip | Load;
但是,我无法从存储中检索任何信息,此.cards$未从选择器中定义:

app.component.ts

this.store.dispatch(new fromActions.Load(this.cards));
this.cards$ = this.store.pipe(select(fromState.getCards));

存储区正在使用阵列进行填充。所以这里没有问题,我认为我的app.state.ts选择器设置不正确(或者app.module.ts中的部分设置不正确)。我哪里做错了?

通过如下方式声明您的存储:
StoreModule.forRoot({AppReducer})
,据我所知,您的状态对象将如下所示:

{
评价者:{
getCards:。。。,
getFlippedCards:。。。,
}
}
意思是
constappstate=(State:appState)=>State
将返回上述对象,该对象没有任何其他属性,除了
AppReducer

根据经验,存储区的每个属性(片)都必须与一个减速机关联。因此,如果您有:
StoreModule.forRoot({a:aReducer,b:bReducer,c:cReducer})
,您的状态将如下所示:

{
a:。。。,
b:。。。,
c:。。。,
}
我把整个州看作一个饼,每个部分都是一个特征

一个快速解决方案是:

导出接口AppState{
功能名称:{
getCards:Card[];
getFlippedCards:Card[];
当前播放器:布尔;
firstPlayerScore:数字;
第二名球员核心:号码;
翻转:布尔;
错误:字符串;
}
}
常量featureState=createFeatureSelector('featureName');
export const getCards=createSelector(featureState,(state)=>state.getCards);
/* ... */