【问题标题】:angular 2 - routing guard returning observable<boolean>, understanding角度 2 - 路由保护返回 observable<boolean>,理解
【发布时间】:2016-09-21 22:02:51
【问题描述】:

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

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

CheckForToken() 只是在 localStorage 中存在令牌时附加授权标头。

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 => //用res做点什么)

但是这里我只返回一个 observable,它没有被订阅,但是守卫如何评估它?

感谢您的澄清!

【问题讨论】:

    标签: angular rxjs angular2-routing observable


    【解决方案1】:

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

    关于导航的大部分工作都在runNavigate 方法上进行。它到达守卫的点是here,这里有一个对checkGuards 的调用,它返回一个Observable&lt;boolean&gt;。根据它是什么类型的守卫,它将为该类型的守卫调用一个特定的方法,该方法也返回一个Observable&lt;boolean&gt;。所有这些“特定方法”都调用一个方法wrapIntoObservable,传入保护方法的结果。如果您查看wrapIntoObservable 源代码,您会看到它会检查 Observable、Promise 或常规值。无论哪种情况,都会返回一个 Observable。

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

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

    【讨论】:

    • 我注意到你说“......一旦那些 Observables 都被解决......”,但你能强调 Observables 必须完成吗?这似乎吸引了很多人。
    • @cartant 我让它更准确一点。所有的守卫 observables 都与 mergeMap 合并成一个单独的 boolean emitting observable :-)
    • 非常感谢详细的解释!!!所以基本上我在上面创建的 observable 以及我在 canActivate 中返回它的方式就足够了?
    • @HanChe 你可以返回一个 Observsble 或者一个 Promise,或者一个正常值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2019-05-26
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多