【问题标题】:Angular 2 RC5 - Redirecting the route with ObservableAngular 2 RC5 - 使用 Observable 重定向路由
【发布时间】:2016-08-20 01:09:45
【问题描述】:

如果函数 canActivate 的值为 false,我无法将受保护的组件 HeaderComponent 重定向到 LoginComponent 组件。

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);

【问题讨论】:

    标签: redirect angular observable


    【解决方案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
                    }
                )
            }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-19
      • 1970-01-01
      • 2017-08-10
      • 2016-12-28
      • 2016-12-22
      • 1970-01-01
      • 2017-01-02
      • 2017-07-27
      • 2017-04-24
      相关资源
      最近更新 更多