router.navigate和router.navigateByUrl无法正常工作

Mar*_*ers 7 oauth-2.0 angular angular-router-guards

我将所请求的Url保存在localstorage中,重定向到身份服务器,这个重定向回我的根URL,然后我想导航到之前保存的URL.

我在守卫中保存网址:

canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> {

    const hasAccessToken$ = Observable.of(this.oAuthService.hasValidAccessToken());

    const setRedirect$ = hasAccessToken$
      .filter(isAllowed => !isAllowed)
      .do(() => localStorage.setItem('login.redirect', state.url)) // save requested url for later redirect
      .do(() => this.oAuthService.initImplicitFlow());

    setRedirect$.subscribe();
    return hasAccessToken$;
  }
Run Code Online (Sandbox Code Playgroud)

我正在尝试在我的app.component.ts中重定向:

ngOnInit() {
    this.oAuthService.tryLogin({ onTokenReceived: () => this.redirect() }); // try to parse token from url
  }

private redirect() {
    const url = localStorage.getItem('login.redirect');
    console.log(url);
    this.router.navigateByUrl(url);
  }
Run Code Online (Sandbox Code Playgroud)

我的路由看起来像这样:

const routes: Routes = [
    {
        path: 'files',
        loadChildren: './folder-page/folder-page.module#FolderPageModule',
        canActivate: [AuthGuard]
    },
    {
        path: 'recent',
        loadChildren: './recent-page/recent-page.module#RecentPageModule',
        canActivate: [AuthGuard]
    }
];
Run Code Online (Sandbox Code Playgroud)

如果我尝试访问/recent,它将正确存储在localstorage中,console.log输出正确打印'/recent'但不会发生导航.页面保留在根URL('/')中.

我已经尝试过硬编码网址('/recent'和'recent')并使用其他功能router.navigate(url)(也尝试过硬编码).

编辑 用setTimeout(1000)包装导航工作......但这不是正确的解决方案