2017-03-26 7 views
0

私のアプリケーションのngrxエフェクトに問題があります。私は基本的にルータストアのgo()を使ってナビゲートするのに、concatMap()を使って複数のアクションを実行しようとしています。ここでアクションの配列をディスパッチすることも、ngrxエフェクトからナビゲートすることもできますか?

が有効です:

@Effect() 
    loadPersonalInfoAndSignin$: Observable<Action> = this.actions$ 
    .ofType(session.ActionTypes.LOAD_PERSONAL_INFO) 
    .map((action: LoadPersonalInfoAction) => action.payload) 
    .do(sessionToken => { 
     localStorage.setItem('authenticated', 'true'); 
     localStorage.setItem('sessionToken', sessionToken); 
    }) 
    .switchMap(() => this.userAccountService 
     .retrieveCurrentUserAccount() 
     .concatMap(currentUserAccount => [ 
     new LoadUserAccountAction(currentUserAccount), 
     new SigninAction(), 
     new LoadMessagesAction({}) 
     ]) 
    ) 
    .mapTo(go(['/dashboard'])); 

私は.mapTo(go(['/dashboard']))を削除する場合は、concatMapアレイ内のすべての3つのアクションが成功し、それに対応する効果に派遣されています。私mapTo(go(...

...それに対応する効果に派遣されていない(すなわちSigninAction & LoadMessagesAction)配列の最後の2つのアクションを起こしている理由

私は、したがって、疑問に思って誰かが助けてくださいことはできますか?

編集:次のようにdomapToを変更:次のエラーで

.do(go(['/dashboard'])); 

結果:goコールのためdoを使用して

ERROR in /Users/julien/Documents/projects/bignibou/bignibou-client/src/app/core/store/session/session.effects.ts (55,9): Argument of type 'Action' is not assignable to parameter of type 'PartialObserver<SigninAction>'. 
    Type 'Action' is not assignable to type 'CompletionObserver<SigninAction>'. 
    Property 'complete' is missing in type 'Action'. 
+0

があなたの代わりに '' mapTo'のdo'を使用してみましたか? – olsn

+0

いいえ。私が試してみましょう。 – balteo

+0

あなたの提案を考慮に入れて投稿を編集しました。 – balteo

答えて

1

は、ルートが変更され表示されません。 go is an action creatorを作成し、アクションを受信して​​ルート変更を反映させるために、@ngrx/router-storeのエフェクトから生成するアクションを生成する必要があります。

また、mapToオペレータは受信した値を無視して指定した値を放出するため、適切ではありません。

代わりに、あなたはあなたのconcatMap配列にgo呼び出しによって作成されたアクション含まれている必要があります

@Effect() 
loadPersonalInfoAndSignin$: Observable<Action> = this.actions$ 
    .ofType(session.ActionTypes.LOAD_PERSONAL_INFO) 
    .map((action: LoadPersonalInfoAction) => action.payload) 
    .do(sessionToken => { 
    localStorage.setItem('authenticated', 'true'); 
    localStorage.setItem('sessionToken', sessionToken); 
    }) 
    .switchMap(() => this.userAccountService 
    .retrieveCurrentUserAccount() 
    .concatMap(currentUserAccount => [ 
     new LoadUserAccountAction(currentUserAccount), 
     new SigninAction(), 
     new LoadMessagesAction({}), 
     go(['/dashboard']) 
    ]) 
); 
+0

この包括的な回答カートマンにもう一度感謝します! – balteo

関連する問題