当有效负载数据与当前状态值相同时如何触发对 ngxs 状态 select 的订阅

How to trigger subscription on ngxs state select when payload data is the same as the current states value

我想知道如何解决这个问题。

我有一个状态模型,其中 属性 'triedSubmitting' 默认设置为 false。 现在,当有人点击提交按钮时,我会发送一个操作来设置状态,如下所示

//The action dispatched from my component
this.store.dispatch(new SetTriedSubmittingOnConfirmationState(true));

//The action in the state itself
@Action(SetTriedSubmittingOnConfirmationState) SetTriedSubmittingOnConfirmationState(state: StateContext<ConfirmationStateModel>, payload: SetTriedSubmittingOnConfirmationState){
    state.setState(patch({triedSubmitting: payload.data}));
}

现在,一旦此操作发生,它就会触发对我的状态的订阅 select。

@Select(ConfirmationState.triedSubmitting) triedSubmitting$: Observable<boolean>;

this.addSubscription(this.triedSubmitting$
      .pipe(
        map(triedSubmitting => {
          return triedSubmitting;
        })
      ).subscribe(triedSubmitting => {
          if(!!triedSubmitting && !!this.forms){
            this.formControls = new Array<FormControlExtension>();
            this.iterateForms(this.forms);
          }
        }
      ))

这按预期工作

然而,当用户第二次按下按钮时,动作被调度,动作发生但订阅永远不会再次触发。

为什么会这样,我是否以错误的方式使用了 patch 运算符?

订阅不会再次被触发,因为 NGXS 状态没有改变——即 triedSubmitting 的值是 true 并且仍然是 true 所以状态 Observable 没有'发出一个新值。

(根据记忆)NGXS 在内部使用 distinctUntilChanged 以最大限度地减少订阅者收到的更改数量。

听起来在您的用例中您更感兴趣的是正在分派的操作,而不是状态更改,因此您可以考虑使用操作流进行通知而不是订阅“ConfirmationState” - 请参阅 NGXS 文档action handlers