2016-08-20 107 views
2

如果值为false,那么我不会设法将受保护组件HeaderComponent重定向到LoginComponent组件,但函数canActivate。Angular 2 RC5 - 使用Observable重定向路线

HeaderComponent组件和他们的孩子受到保护,只有访问URL http://localhost:3000/#/header/index屏幕变为空白,我希望它被引导到http://localhost:3000/#/auth是登录屏幕

任何人都知道怎么帮我?

auth.guard.ts

import {Injectable} from '@angular/core'; 
import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router} from '@angular/router'; 
import {Observable, BehaviorSubject} from 'rxjs/Rx'; 
import 'rxjs/operator/take'; 
import {LoginService} from './login/login.service'; 

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private loginService: LoginService, private router: Router) {} 

    canActivate(
     route: ActivatedRouteSnapshot, 
     state: RouterStateSnapshot): Observable<boolean> | boolean { 
     this.loginService.logado() 
      .subscribe(
       data => { 
        return data //true 
       }, 
       error => { 
        this.loginService.redirectUrl = state.url; 
        this.router.navigate(['/auth']); 
        return error //false 
       } 
     ) 
     return this.loginService.logado().take(1); 
    } 
} 

routes.component.ts

import {Routes, RouterModule} from '@angular/router'; 
import {LoginComponent} from './login/login.component'; 
import {HeaderComponent} from './header/header.component'; 
import {AuthGuard} from './auth.guard'; 
import {UserComponent} from './user/user.component'; 
import {IndexComponent} from './index/index.component'; 
import {UserPasswordComponent} from './user/user.password.component'; 

export const appRoutes: Routes = [ 
    {path: 'auth', component: LoginComponent}, 
    {path: 'user', component: UserPasswordComponent}, 
    {path: 'header', component: HeaderComponent, canActivate: [AuthGuard], 
     children: [ 
      {path: 'index', component: IndexComponent}, 
      {path: 'user', component: UserComponent} 
     ] 
    }, 
    {path: '', redirectTo: 'auth', pathMatch: 'full'}, 
]; 

export const routing = RouterModule.forRoot(appRoutes); 

回答

1

它可以修复auth.guard.ts文件之后,利用作为参考Angular2 - Extending router and Observable

auth.guard.ts

import {Injectable} from '@angular/core'; 
import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router} from '@angular/router'; 
import {Observable} from 'rxjs/Rx'; 
import {LoginService} from './login/login.service'; 

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private loginService: LoginService, private router: Router) {} 

    canActivate(
     route: ActivatedRouteSnapshot, 
     state: RouterStateSnapshot): Observable<boolean> | boolean { 
     return this.loginService.logado() 
      .map(
       data => { 
        if (data == false) { 
         this.router.navigate(['/auth']); 
         return data; 
        }; 

        if (data == true) { 
         return data; 
        } 
       }, 
       error => { 
        this.router.navigate(['/auth']); 
        return error 
       } 
      ) 
     } 
}