Observable <UrlTree>和UrlTree有什么区别?

时间:2019-08-03 14:39:50

标签: angular rxjs observable angular-router angular-router-guards

我正在为我的一个应用程序组件实现canActivate防护。

基于documentationUrlTreeObservable<UrlTree>都是有效的返回类型。

我了解到,通过将“事物”包装到可观察对象中将使事物变得异步,但是我不理解路由器/路由上下文的区别。

UrlTreeObservable<UrlTree>在路由器如何处理方面有什么区别?

您何时将另一个使用?

我假设相同的理由也可以应用于<boolean>Observable<boolean>

UrlTree版本:

export class myGuard implements CanActivate {
  constructor(private router: Router) {}
  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    return this.router.parseUrl('newRoute');
  }
}

可观察的版本:

import { of } from 'rxjs';
export class myGuard implements CanActivate {
  constructor(private router: Router) {}
  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    return of(this.router.parseUrl('newRoute'));
  }
}

我已经尝试过两个版本,并且都可以在开发环境中正常工作。

1 个答案:

答案 0 :(得分:2)

区别在于警卫如何对待响应类型...如果是可观察的,它会订阅并使用订阅的值来做出路由决策。如果不是可观察的,则仅使用返回的值来做出决定。这是为了方便起见,但并不强制为您的后卫提供异步功能。

当您根据异步内容(例如主题值或http请求或类似内容)做出决定时,请使用可观察的内容。当您基于同步的内容(例如localStorage值或其他内容)做出决定时,请使用不可观察的结果。