2016-10-04 5 views
4

Ich versuche, eine "Auth-App" mit Redux (ngrx) zu erstellen, und ich versuche, meinen App-Status im Geheimdienst zu verwenden. Hier können Sie meine Github sehen: https://github.com/tamasfoldi/ngrx-auth/tree/router Dies ist, wie der Hut wie folgt aussieht:Angular 2 Router v3 beobachtbarer Wächter mit ngrx

@Injectable() 
export class SecretGuard implements CanActivate { 
    constructor(private store: Store<AppState>, private router: Router) { 
    } 
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { 
    return this.store.let(getLoginState()) 
     .map(state$ => state$.isLoggedIn) 
    } 
} 

Es kehrt mit dem isLoggedIn Attribut, das in Ordnung sein sollte, weil Router Versprechungen und beobachtbaren löst, aber der Router blockieren, wenn ich navigieren Sie zu der geheime Teil. Hier sind meine Routen:

export const appRoutes: Routes = [ 
    { 
    path: '', 
    redirectTo: 'auth', 
    pathMatch: 'full' 
    }, 
    { 
    path: 'auth', 
    children: [ 
     { path: '', redirectTo: 'login', pathMatch: 'full' }, 
     { path: 'login', component: LoginComponent }, 
     { path: 'register', component: RegisterComponent } 
    ] 
    }, 
    { 
    path: 'secret', 
    canActivate: [SecretGuard], 
    children: [ 
     { path: '', redirectTo: 'default', pathMatch: 'full' }, 
     { path: 'default', component: DefaultSecretComponent } 
    ] 
    } 
]; 

In redux Ich erhalte den init Zustand, so auch ich habe versucht, die erste Emission in meiner beobachtbar zu überspringen, aber es weder funktioniert. Hier ist das Überspringen Code:

@Injectable() 
export class SecretGuard implements CanActivate { 
    constructor(private store: Store<AppState>, private router: Router) { 
    } 
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { 
    return this.store.let(getLoginState()) 
     .skip(1) 
     .map(state$ => state$.isLoggedIn) 
    } 
} 

Wenn ich meine AuthService der Auth-Funktion verwenden Sie es richtig funktioniert, aber diese Lösung ist nicht „Redux-like“. Kannst du mir dabei helfen, wie es mit ngrx funktioniert? Oder ich kann mein Appstate nicht in Wächtern verwenden?

Antwort

4

Sie können synchron Wert von Speicher erhalten, müssen nicht „alles streamen“ (:

https://github.com/ngrx/store#getstate-getvalue-and-value

import 'rxjs/add/operator/take'; 

function getState(store: Store<State>): State { 
    let state: State; 
    store.take(1).subscribe(s => state = s); 
    return state; 
} 

@Injectable() 
export class SecretGuard implements CanActivate { 
    constructor(private store: Store<AppState>, private router: Router) { } 

    canActivate():boolean { 
    return getState(this.store).login.isLoggedIn; 
    } 
} 
+0

Dank es funktioniert, aber wenn ich fügen Sie einige Fehler es Behandlungslogik (Weiterleitung an Auth, wenn der Wächter ausfällt) Ich werde auf die Auth-Seite weitergeleitet. Ich denke, das liegt daran, dass die isLoggedIn-Eigenschaft des Anfangszustands falsch ist. Wenn ich (1) überspringe, ist es OK beim Neuladen, aber nicht beim Versuch, von der navbar, weil es jeden ersten überspringt Hast du eine Idee, wie du das lösen kannst? – bucicimaci

+0

Es funktioniert, wenn ich debounceTime verwende, aber nicht sicher, ob das funktioniert ist die beste Lösung – bucicimaci

+2

Ich hatte dieses Problem nicht, weil ich mich früh entschieden habe, zwei Reduzierer zu haben - 'auth' und' user'. Ich benutze 'auth' nur für wahr/falsch/pending und' user' für Benutzerprofildaten, dann 'auth' in Wächtern und' user' in Komponenten für Weiterleitungen. Es ist etwas mehr Arbeit bei der Anmeldung/Abmeldung - Ich habe 'LoginUserAction' und' LoginAuthAction' geschickt, bin aber später einfacher zu handhaben. Ich erwarte, dass es auch für Lazy-Loading nützlich sein wird, ich kann "Auth" in ** AppModule ** und "Benutzer" in ** AdminModule ** packen ... – Sasxa