angular 2 - 路由保护返回observable <boolean>,理解

时间:2016-09-21 22:02:52

标签: angular rxjs angular2-routing observable

我想这可能更像是一个rxjs理解主题,但上下文说明了我对它的最佳需求:)

在它下面是我的PageGuard类中的工作代码,它阻止路由到页面,除非localStorage中存在有效的jwt。

如果在localStorage中存在令牌,CheckForToken()只会附加授权标头。

public isAuthenticated():Observable<boolean>{
    this.checkForToken();
    let isAuth = new Observable<boolean>(observer => {
        this.http.get(`https://testhan-api.selfbits.io/api/v1/user`,{headers: this.headers}).subscribe(res => {
            if (res.status === 200){
                observer.next(true);
                observer.complete();
            }else{
                observer.next(false);
                observer.complete()
            }
        },err => console.log(err));
    });
    return isAuth
}

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
    return this.isAuthenticated()
}

,路由路径如下所示

{ 
    path:'dashboard', 
    component:DashboardComponent, 
    canActivate:PageGuard
}

我的问题:到目前为止,我的理解是你需要订阅一个observable,以便执行它,比如

  

observable.subscribe(res =&gt; //用res做某事)

但是在这里我只返回一个可观察的,它没有得到订阅,但是后卫如何评估呢?

感谢您的澄清!

1 个答案:

答案 0 :(得分:3)

如果你真的想深入了解细节...这里有: - )

关于导航的大部分工作都采用runNavigate方法。它到达警卫的地方是here,其中有一个checkGuards的调用,它返回Observable<boolean>。根据它的防护类型,它将为该类型的防护调用特定方法,该方法也返回Observable<boolean>。所有这些“特定方法”都调用方法wrapIntoObservable传递guard方法的结果。如果查看wrapIntoObservable源代码,您将看到它检查Observable,Promise或常规值。在任何一种情况下,都会返回一个Observable。

现在回到调用堆栈,一旦所有的守护Observable都被合并到一个发出单个布尔值的Observable,那个observable就会经历resolving data for the routes的过程。如果合并的guard observable返回false,则新的解析Observable将返回一个Observable为false。否则,它将返回已解析数据的Observable。

在下一步中,解析Observable获取subscribed to with forEach。如果已解析的数据为假(从警​​卫转发错误),则它将不返回任何内容并且路由停止。否则, anActivatedRoute。从那里继续导航的其余部分。