我正在尝试授权用户查看某个路由器路径。
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.userService.isAdmin() || this.userService.isEmployee()
}
UserService方法是同步的。 UserService是singleton,它从后端加载用户数据。当用户经历正常的应用程序流程时,这不是问题。但是当用户试图直接进入受保护的路径路径时,可能无法及时加载UserService信息,从而导致错误
EXCEPTION: Uncaught (in promise): TypeError: Cannot read property 'roleId' of undefined
TypeError: Cannot read property 'roleId' of undefined
这是UserService代码
@Injectable()
export class UserService {
public $user;
public loggedUser;
constructor(private loginService: ResourceLoginService) {
this.$user = this.loginService.get().$observable;
this.$user.subscribe(response => {
this.loggedUser = response;
});
}
isAdmin(): boolean {
return this.loggedUser.roleId === 1;
}
我基本上想订阅$ user并调用方法async如果还没有完成,或者调用方法,如果它已经完成了CanActive后卫。采用这种方法的正确方法是什么?
答案 0 :(得分:2)
您可以删除The above details are only for understanding marshaling and unmarshaling process using tools in Jax-B API.
的订阅并写入:
For more details , check below examples
对于user$
,您可以返回: isAdmin(): boolean {
return this.user$
.map(user => user.roleId === 1);
}
,它会在解析路由权限之前等待Promise / Observable。
答案 1 :(得分:0)
解决方案是函数应该返回一致的类型,无论如何。如果其中一个case是同步的,另一个异步函数需要从同步源返回async observable。
export class UserService {
public $user;
public loggedUser;
constructor(private loginService: ResourceLoginService) {
this.$user = this.loginService.get().$observable;
this.$user.subscribe(response => this.loggedUser = response);
}
isAdmin(): Observable<boolean> {
if (this.loggedUser) {
return Observable.of(this.loggedUser.roleId === 1);
} else
return this.$user
.map(user => user.roleId === 1);
}