Angular 如何对角度观测值进行编码以在映射时返回平面值

Angular 如何对角度观测值进行编码以在映射时返回平面值,angular,angular2-routing,observable,Angular,Angular2 Routing,Observable,我写的代码中,如果某个值设置为true,则不允许客户出现在页面上。我现在有了工作代码,但直觉告诉我,这不是最有效的使用 代码是: canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> { let bar= false; this.foo$.subscribe((x) =&

我写的代码中,如果某个值设置为true,则不允许客户出现在页面上。我现在有了工作代码,但直觉告诉我,这不是最有效的使用

代码是:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
    let bar= false;
    this.foo$.subscribe((x) => {
        bar = x;
    });

    return !bar;
}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):布尔值|可观察|承诺{
设bar=false;
此.foo$.subscribe((x)=>{
bar=x;
});
返回!酒吧;
}
但我希望它看起来像这样:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
    return this.foo$.subscribe((x) => {
        return x;
    });
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
    return this.foo$.map(x => !x);
}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):布尔值|可观察|承诺{
返回此.foo$.subscribe((x)=>{
返回x;
});
}

问题是,如果我像这样使用它,它会不断返回一个可观察值,并且守卫的canActivate函数在该可观察值下不起作用。

如果
this.foo$
是一个
可观察值
,那么您可以简单地对
map()
函数()中的布尔值求反并返回结果
可观察的
,如下所示:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
    return this.foo$.subscribe((x) => {
        return x;
    });
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
    return this.foo$.map(x => !x);
}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):布尔值|可观察|承诺{
返回这个.foo$.map(x=>!x);
}

由于异步
foo$
订阅,您的第一个代码段将无法可靠工作。在调用
foo$.subscribe()
方法之前,该函数可能总是返回true

如果
this.foo$
是一个
可观察的
,那么您可以简单地对
映射()
函数()中的布尔值求反,并返回结果
可观察的
,如下所示:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
    return this.foo$.subscribe((x) => {
        return x;
    });
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
    return this.foo$.map(x => !x);
}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):布尔值|可观察|承诺{
返回这个.foo$.map(x=>!x);
}

由于异步
foo$
订阅,您的第一个代码段将无法可靠工作。在调用
foo$.subscribe()
方法之前,函数可能总是返回true。您的第一个代码片段不会按预期的方式工作。第二个代码段应该可以正常工作。您的第一个代码段无法按预期方式工作,这是什么意思。第二个代码段应该可以正常工作。你什么意思
守卫不工作
?它工作正常现在的问题是调用路由后加载了foo$的值有没有办法让守卫在这种情况发生后采取行动?@a.Leenders根据加载
foo$
的方式(例如通过服务),你可以将所需的服务注入守卫,并在
canActivate()中调用它
手动方法。我们使用ngrx,但这是一个不同的问题,感谢您的帮助。它工作正常。现在的问题是调用路由后加载了foo$的值。是否有办法让警卫在发生这种情况后采取行动?@a.Leenders,具体取决于加载方式
foo$
(例如,通过服务),您可以将所需的服务注入到Guard中,然后在
canActivate()
方法中手动调用它。我们使用ngrx来实现这一点,但这是另一个问题,谢谢您的帮助。