navigationend - Redirigir a un componente diferente dentro de @CanActivate en Angular2
title angular 6 (4)
¡Sí tu puedes! Hacer esto evitará que su componente cree una instancia para nada.
Primero, crea un nuevo archivo src/app-injector.ts
let appInjectorRef;
export const appInjector:any = (injector = false) => {
if (!injector) {
return appInjectorRef;
}
appInjectorRef = injector;
return appInjectorRef;
};
Luego, obtenga la referencia de bootstrap
// ...
import {appInjector} from ''./app-injector'';
// ...
bootstrap(App, [
ROUTER_PROVIDERS
]).then((appRef) => appInjector(appRef.injector));
Finalmente en tu función
// ...
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 voilà!
Fue discutido aquí https://github.com/angular/angular/issues/4112
Puede encontrar un ejemplo completo aquí http://plnkr.co/edit/siMNH53PCuvUBRLk6suc?p=preview por @brandonroberts
¿Hay alguna forma en que podamos redirigir a un componente diferente de @CanActivate en Angular2?
Esto podría ayudar a alguien que está tratando de esperar algo antes de continuar.
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;
}
}
)
}
Solución final angular 2.0:
Su guardia puede ser simplemente un inyectable que, como tal, puede incluir sus propios inyectables. Entonces podemos simplemente inyectar el enrutador, para poder redirigirlo . No olvides agregar el servicio como proveedor en tu módulo de aplicación.
@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]}
];
A partir de hoy, con la última @ angular / enrutador 3.0.0-rc.1, aquí hay un par de referencias sobre cómo hacer eso a través de guardias CanActivate
en las rutas:
- referencia angular 2
- Dos respuestas a esta pregunta AS , por Nilz11 y por Jason
La esencia principal de la lógica se ve así:
// ...
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;
}
}