我应该如何检测组件中的 NGRX 状态事件?

How should I detect NGRX state event in a component?

我正在尝试在 Angular 应用程序中使用 ngrx/store 来删除当前正在发生的大量 http 请求并创建应用程序状态。

所有库都应该是最新的(在过去几周内)。

我有一个显示比赛的比赛组件。比赛组件的另一个实例可能会改变比赛,我想在也显示相同比赛的任何其他组件中反映这一点。

因此,如果比赛在一个组件中发生变化,我希望在商店中更新该组件,并且引用比赛的任何其他组件都应该获得更新的比赛数据。

我的组件需要什么来订阅来自状态的事件(我认为这是我需要做的)以获取更新的数据(竞赛)。

我计划稍后添加一个 Effect 来管理对后端的更新,目前我只是想让 FE 正常工作,这就是为什么它没有在这里列出的原因。

此时我刚刚从教程中复制了一些代码,请随时指出您发现的任何其他问题(例如不必要的代码)

竞赛-action.ts

export enum ContestActionTypes {
 AddContest = '[Contest] Create Contest',
 UpdateContest = '[Contest] Update Contest',
}

export class CreateContest implements Action {
  readonly type = ContestActionTypes.AddContest;

  constructor(public payload: { contest: Contest }) {
  }
}

export class UpdateContest implements Action {
  readonly type = ContestActionTypes.UpdateContest;

  constructor(public payload: { contest: Contest }) {
  }
}

export type ContestActions =
  CreateContest
  | UpdateContest;

竞赛-reducer.ts

export interface ContestState extends EntityState<Contest> {
  allContestsLoaded: boolean;
}

export const adapter: EntityAdapter<Contest> =
  createEntityAdapter<Contest>({});


export const initialContestState: ContestState =
  adapter.getInitialState({
    allContestsLoaded: false
  });


export function contestReducer(state = initialContestState,
                               action: ContestActions): ContestState {
  switch (action.type) {
    case ContestActionTypes.AddContest: {
      return adapter.addOne(action.payload.contest, state);
    }
    case ContestActionTypes.UpdateContest: {
      console.log(`contestReducer.UpdateContest payload: ` + action.payload.contest);
      return adapter.updateOne(
        {id: action.payload.contest.id, changes: action.payload.contest},
                state);
    }
    default: {
      return state;
    }
  }

  return contestReducer(state, action);
}

竞赛-component.ts 当 html 表单更改时,从另一个函数正确调用 saveContest() 函数。

我猜我需要向组件的 ngOnInit() 添加“东西”以订阅商店发出的事件? 这正是我需要帮助的地方。

private saveContest(): void {
    this.store.dispatch(new UpdateContest({contest: this.contest}));

}

这家商店是被动的。 如果您在商店中更改某些内容,所有订阅者都会收到此更改的通知。 要读取商店数据,您可以使用 selectors.

您需要为此使用 ngrx 选择器https://ngrx.io/guide/store/selectors