2016-01-10 11 views

Odpowiedz

12

Tak, możesz! Wykonanie tej czynności uniemożliwi Twojemu komponentowi tworzenie instancji za darmo.

Najpierw utworzyć nowy plik src/app-injector.ts

let appInjectorRef; 

export const appInjector:any = (injector = false) => { 
    if (!injector) { 
     return appInjectorRef; 
    } 

    appInjectorRef = injector; 

    return appInjectorRef; 
}; 

Następnie uzyskać referencję bootstrap

// ... 
import {appInjector} from './app-injector'; 
// ... 


bootstrap(App, [ 
    ROUTER_PROVIDERS 
]).then((appRef) => appInjector(appRef.injector)); 

Ostatecznie w swojej funkcji

// ... 
import {appInjector} from './app-injector'; 
// ... 

@CanActivate((next, prev) => { 
    let injector = appInjector(); 
    let router = injector.get(Router); 

    if (42 != 4 + 2) { 
    router.navigate(['You', 'Shall', 'Not', 'Pass']); 
    return false; 
    } 

    return true; 
}) 

Et voà!

To był omawiany tutaj https://github.com/angular/angular/issues/4112

można znaleźć pełny przykład tutaj http://plnkr.co/edit/siMNH53PCuvUBRLk6suc?p=preview przez @brandonroberts

+1

edytowano odpowiedź (jeżeli zatwierdzone): 'const eksport appInject: any' inaczej błędy zostaną rzucone na maszynopis kompilacji. – lexith

43

Na dzień dzisiejszy, z najnowszej @ kątowe/routera 3.0.0-rc.1, oto kilka referencji, w jaki sposób to zrobić poprzez CanActivate strażników na trasach:

  1. angular 2 reference
  2. dwie odpowiedzi na to pytanie SO, przez Nilz11 i Jason

Główny sens logiki wygląda następująco:

// ... 
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
    if (this.authService.isLoggedIn) { 
    // all ok, proceed navigation to routed component 
    return true; 
    } 
    else { 
    // start a new navigation to redirect to login page 
    this.router.navigate(['/login']); 
    // abort current navigation 
    return false; 
    } 
} 
+4

Powinna to być nowa preferowana odpowiedź z nowym routerem. –

+0

Chciałbym zobaczyć, jak przekierowanie do zamierzonej ścieżki jest wykonywane po dziennikach użytkowników za pomocą tego auth guarda. – Davvit

+0

@Davvit Nie jestem pewien, co zrobić z proponowaną zmianą: po prostu dodając parametr do rozmowy, nie dostarczamy znacznie więcej informacji. Czy nie byłbyś bardziej pomocny dla mnie i innych, gdybyś dodał nową odpowiedź, w której umieścisz wszystkie dodatki i zmiany, aby spełnić twoje zapytanie? Co myślisz? – superjos

9

Kątowymi 2,0 ostatecznego rozwiązania:

baczności mogą łatwo być tylko do wstrzyknięć, która jako taka może zawierają własne środki do wstrzykiwania. Możemy więc po prostu wprowadzić router, aby przekierować. Nie zapomnij dodać usługi jako dostawcy do modułu aplikacji.

@Injectable() 
export class AuthGuard implements CanActivate { 

    constructor(private router: Router, private authService: AuthService) {} 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean { 
    if (!authService.isAuthenticated()) { 
     this.router.navigate(['/login']); 
     return false; 
    } 
    return true; 
    } 
} 

export const ROUTES: Routes = [ 
    {path: 'login', component: LoginComponent}, 
    {path: 'protected', loadChildren: 'DashboardComponent', canActivate: [AuthGuard]} 
]; 
2

To może pomóc komuś, kto próbuje coś poczekać, zanim przejdzie dalej.

waitForBonusToLoad(): Observable<[boolean, string]> { 

const userClassBonusLoaded$ = this.store.select(fromRoot.getUserClasssBonusLoaded); 
const userClassSelected$ = this.store.select(fromRoot.getClassAttendancesSelectedId); 

return userClassBonusLoaded$.withLatestFrom(userClassSelected$) 
    .do(([val, val2]) => { 
    if (val === null && val2 !== null) { 
     this.store.dispatch(new userClassBonus.LoadAction(val2)); 
    } 
    }) 
    .filter(([val, val2]) => { 
    if(val === null && val2 === null) return true; 
    else return val; 
    }) 
    .map(val => { 
    return val; 
    }) 
    .take(1); 
} 

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { 
return this.waitForBonusToLoad().map(([val, val2]) => 
    { 
    if(val === null && val2 === null){ 
     this.router.navigate(['/portal/user-bio']); 
     return false; 
    } 
    else { 
     return true; 
    } 
    } 
) 
} 
+0

Twoje proponowane rozwiązanie zawiera efekty uboczne w Observable.map() Zamiast tego powinieneś przenieść nawigację poza mapę() i do zrobić(). Twoja mapa powinna po prostu rozwiązać TRUE/FALSE. Obserwowalne $ .map ((x) => x === 1) .do (result => {if (result) navigate();}); –

Powiązane problemy