【发布时间】:2021-11-10 15:21:54
【问题描述】:
当我重新加载我的页面时,它总是转到空白页面而不是同一页面。这背后的原因是一旦用户刷新页面就会调用 canActivate 方法,该方法正在检查用户的权限,并且无法立即获取用户数据。用户数据会在几秒钟后出现。 有什么办法可以让 canActivate 方法等到数据完成?我一直在浏览 RxJS 的页面,但不知道该怎么做。 有人可以给我建议吗?
constructor(private router: Router, private userDataService: UserDataService) {
userDataService.userData$.subscribe(
(data: User) => {
this.userData = userData --> comes after some seconds
}
);
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree
{
const result = this.getUserData(route);
if (!result) {
this.blankPage();
}
return result;
}
public getUserData(): Observable<boolean> {
if (this.userData) {
check for permissions...
return of(true);
}
return of(false);
}
userdata.service.ts:
userDataSubscription: Subscription;
userData: BehaviorSubject<User> = new BehaviorSubject<User>(null);
public userData$: Observable<User> = this.userData.asObservable();
private getUserData(): void {
const userData$ = new Observable(
subscriber => subscriber.next(new User())
).pipe(
delay(1000),
mergeMap((model: User) => this.getUserInfo(model)),
mergeMap((model: User) => this.getUserPermission(model)),
catchError((err, caught) => {
console.error('failed')
return caught;
})
);
this.userContextDataSubscription = userData$.subscribe(
(data: User) => {
this.userData,next(model);
},
() => console.error('failed')
);
}
【问题讨论】:
-
“同一页面”在您点击(硬)刷新后不再存在。从那时起,浏览器将再次负责并显示一个空白页面,直到您的应用程序为其提供最初显示的内容。您最好的选择似乎是在加载 Angular 应用程序(或任何类型的路线)之前一直显示的加载屏幕。
-
@PhilippMeissner 感谢您的回复。无论如何我都在显示 loadinScreen 但是在加载完成后它将是空白的。这就是为什么它不会回到我的旧路线。它转到 localhost:4200/#/ 而不是 localhost:4200/#/my-comp
-
乍一看,我注意到您手动订阅了 observable。不需要 - 只需让您的
canActivate返回一个解析为boolean的 observable。比如:gist.github.com/PhilippMeissner/… -
@PhilippMeissner。让我试试这个..
-
@PhilippMeissner 刷新后还是去localhost:4200/#/
标签: angular rxjs angular-ui-router canactivate