1

私のアプリケーションはngrx/rxjsを使用しています。サインアウトしてストアから状態をクリアするために、ngrx 効果に依存しています。

残念ながら、コンポーネントの 1 つがセレクター (以下を参照getLatestMessagesByCounterParty) を介してストアをサブスクライブし、このコンポーネントが破棄される前に状態がクリアされるため、次のエラーが発生します。

エラー TypeError: getCurrentUserAccountId で null のプロパティ 'id' を読み取れません

... が であることを示しています。ストアから状態をクリアしたばかりなので、これは非常に論理的ですcurrentUserAccountnull

signout$効果は次のとおりです。

  @Effect()
  signout$: Observable<Action> = this.actions$
    .ofType(authenticated.ActionTypes.SIGNOUT)
    .switchMap(() =>
      this.sessionSignoutService.signout()
        .do(() => {
          localStorage.removeItem('authenticated');
          localStorage.removeItem('sessionToken');
        })
        .concatMap(() => [
          new ClearMessagesAction(null),
          new ClearUserAccountAction(null),//Error thrown here...
          go(['/signin'])//Never reached...
        ]));

ログイン状態をサブスクライブするコンポーネントは次のとおりです。

  ngOnInit() {
    this.store.select(fromRoot.getLatestMessagesByCounterParty)
      .subscribe(latestMessages => this.latestMessages = this.messageService.sortMessagesByDate(latestMessages, this.numberOfConversations));
  }

関連するセレクター:

...
const getCurrentUserAccountId = (state: State) => state.userAccount.currentUserAccount.id;
const getMessagesState = (state: State) => state.message.messages;

...
export const getLatestMessagesByCounterParty = createSelector(getCurrentUserAccountId, getMessagesState, fromMessage.latestMessagesByCounterParty);

どこで、いつ、どのようにストアから状態をクリアするかについてのベスト プラクティスを探しています。理想的には、サブスクライブしているコンポーネントが破棄されたときに、可能な限り最後にそれを行いたいと考えています。

誰かアドバイスしてもらえますか?

編集:コメントをさらに絞り込みましょう。上記の私のコードは次のようになっているはずです。

   .concatMap(() => [
      new ClearMessagesAction(null),
      new ClearUserAccountAction(null),//Error thrown right after this action because selector cannot find id variable on state
      go(['/signin'])//Never reached...
    ]));
4

1 に答える 1