2017-03-26 6 views
0

Ich habe ein Problem mit einem der ngrx-Effekte meiner Anwendung. Ich versuche im Grunde, mehrere Aktionen unter Verwendung concatMap()UND Navigieren mit dem Router Store go() auszuführen. HierIst es möglich, sowohl ein Array von Aktionen zu versenden als auch von einem ngrx-Effekt zu navigieren?

ist der Effekt:

@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'])); 

Wenn ich die .mapTo(go(['/dashboard'])) entfernen, dann alle drei Aktionen im concatMap Array erfolgreich in ihre entsprechenden Effekte ausgelöst werden.

ich deshalb frage mich, warum meine mapTo(go(... die letzten beiden Aktionen in der Anordnung verursacht (das heißt SigninAction & LoadMessagesAction) zu ihren entsprechenden Auswirkungen nicht versandt ..

bitte jemand helfen?

bearbeiten: mapTo zu do Ändern Sie wie folgt vor:

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

Ergebnisse in dem folgenden Fehler:

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

Haben Sie versucht, eine 'do' anstelle des' mapTo' verwenden? – olsn

+0

Nein, habe ich nicht. Lass es mich versuchen. – balteo

+0

Ich habe meinen Beitrag bearbeitet, um Ihren Vorschlag zu berücksichtigen. – balteo

Antwort

1

do für den go Anruf verwendet, wird nicht verändert die Route sehen. go is an action creator und die Aktion, die es erstellt, muss von dem Effekt für @ngrx/router-store ausgegeben werden, um die Aktion zu empfangen und die Routenänderung zu bewirken.

Der Operator mapTo ignoriert auch, was er empfängt und gibt den von Ihnen angegebenen Wert aus, also ist er auch nicht geeignet.

Stattdessen sollten Sie die Aktion durch den go Anruf in Ihrem concatMap Array erstellt sind:

@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

Nochmals vielen Dank für diese umfassende Antwort Cartant! – balteo

Verwandte Themen