私のアプリケーションはngrx/rxjsを使用しています。サインアウトしてストアから状態をクリアするために、ngrx 効果に依存しています。
残念ながら、コンポーネントの 1 つがセレクター (以下を参照getLatestMessagesByCounterParty
) を介してストアをサブスクライブし、このコンポーネントが破棄される前に状態がクリアされるため、次のエラーが発生します。
エラー TypeError: getCurrentUserAccountId で null のプロパティ 'id' を読み取れません
... が であることを示しています。ストアから状態をクリアしたばかりなので、これは非常に論理的ですcurrentUserAccount
。null
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...
]));