2017-09-04 52 views
5
  • Mam konfigurację kątową, która wykorzystuje dwie osłony. canLoad i canActivate
  • zarówno znudzisz z tym samym obserwowane od @ kątowej-Redux/sklepu poprzez @select

Pytanie: Dlaczego canActivate pracy z zaobserwować, że @select powraca podczas gdy canLoad łamie wszelkie routingu odtąd na? Jaka jest różnica między dwoma strażnikami?Dlaczego osłony kątowe zachowują się inaczej podczas korzystania z @select z @ kątowego/redux-sklepowego

Powiązane kątowe problem: https://github.com/angular/angular/issues/18991

auth.guard.ts

@Injectable() 
export class AuthGuard implements CanLoad, CanActivate { 

    @select() readonly authenticated$: Observable<boolean>; // @angular-redux/store 

    canLoad(): Observable<boolean> | boolean { 
    // return true; // works 
    return this.authenticated$; // ERROR: all routing stops from and to the current page 
    } 

    canActivate(): Observable<boolean> | boolean { 
    // return true; // works 
    return this.authenticated$; // works 
    } 

} 

app-routing.module

const routes: Routes = [ 
    { 
    path: '', 
    component: SomeAComponent, 
    pathMatch: 'full' 
    }, 
    { 
    path: 'someb', 
    component: SomeBComponent, 
    canActivate: [ 
     AuthGuard 
    ], 
    }, 
    { 
    path: 'lazy', 
    loadChildren: './lazy/lazy.module#LazyModule', 
    canLoad: [ 
     AuthGuard 
    ] 
    }, 
    { 
    path: '**', 
    redirectTo: '/' 
    } 
]; 
+0

Czy działa, gdy osłona 'canLoad()' jest używana w komponencie, a nie w module z opóźnionym ładowaniem? Sądzę, że jest on powiązany z programem RouterPreloader, który nie ładuje tras 'canLoad'. Z pliku 'router_preloader.d.ts': ' * Jeśli trasa jest chroniona przez strażników 'canLoad', wstępnie załadowana nie załaduje go. ' –

+1

Myślałem, że' canLoad() 'jest używane tylko dla modułów ładowanych automatycznie? Czego można się spodziewać podczas używania go na już załadowanym module? – Markus

+1

Jak wspomniano w wydaniu github, obserwowalne powinno zostać ukończone. Nie jestem pewien, czy zakończy się operacja '@select() readonly authenticated $ .'. Jeśli nie, "take (1)" w teorii nie może być tym, czego szukam, ponieważ nie dostarcza mi najnowszej aktualizacji ze sklepu (http://rxmarbles.com/#take). – Markus

Odpowiedz

0

po prostu wpadł na tej samej kwestii i I myślę, że to błąd w kanciastym. Skończyło się na tym, że po prostu przepisałem moją straż, by przechowywać lokalną zmienną zapełnioną subskrybowaniem Observable. Używam tutaj ngrx/store.

@Injectable() 
export class MustBeAuthenticatedGuard implements CanActivate, CanLoad { 

    constructor(private store: Store<fromAuth.State>) { 
    store.select(fromAuth.authenticated) 
     .subscribe((authenticated) => { 
     this.authenticated = authenticated; 
     }); 
    } 

    private authenticated: boolean 

    canLoad(): boolean { 
    return this.isAuthenticated(); 
    } 

    canActivate(): boolean { 
    return this.isAuthenticated(); 
    } 

    private isAuthenticated() { 
    if (!this.authenticated) { 
     this.store.dispatch(new SignIn()); 
    } 
    return this.authenticated; 
    } 
}