【问题标题】:Getting Last Active URL Prior to Logout in Angular 2 App在 Angular 2 应用程序中注销之前获取最后一个活动 URL
【发布时间】:2017-11-03 21:52:41
【问题描述】:

在我的 Angular 2 应用程序中,我试图将最后一个活动 URL prior 存储给注销的用户,以便在用户重新登录后可以重新加载该 URL。但是,事实证明这是有问题的。考虑一下我的 authenticationService 中的这个注销功能:

logout()
{
    let lastUrl = this.getActiveUrl();
    console.log('Url before logout: ', lastUrl);

    this.apiService.logout();
}

注意这里的“lastUrl”,它调用this.getActiveUrl(),看起来像这样:

getActiveUrl()
{
    let activeUrl = this.router.routerState.snapshot['url'];
    console.log('activeUrl: ', activeUrl);
    return activeUrl;
}

...出现在this.apiService.logout() 之前。但是,尽管如此,“lastUrl”打印到控制台的是“/login”。但这是我退出后立即 结束的 URL。

所以,请帮助我理解这一点:

如果这是同步的,为什么这里没有打印正确的 URL?我错过了什么?以及如何在之前立即获取活动 url 以注销触发并重新定向到“/login”?

编辑:根据评论者的建议,我尝试分配给 localStorage 而不是局部变量,如下所示:

logout()
{
    localStorage.setItem('returnUrl', JSON.stringify(this.router.routerState.snapshot['url']));

    this.apiService.logout();
}

但是当我用localStorage.returnUrl 挖掘出这个值时,我仍然得到“/login”。

【问题讨论】:

  • 如果你把 let lastUrl = this.router.routerState.snapshot['url'];有用吗?
  • 您可以使用Router 代替ActivatedRoute 并使用this.route.url 获取网址
  • 看看我在下面做了什么。

标签: javascript angular typescript routing synchronous


【解决方案1】:

首先,非常感谢 @Sam 的 localStorage 建议。我应该想到的。所以,最后,我需要做的就是在我的 AuthGuardService 中使用 canActivate() 函数中的 RouterStateSnapshot,并将该值保存到 localStorage。然后我只是在重新验证和重新登录时将该值检索到插件中:

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot)
    {

        // Get route content id
        let contentId = Object.getPropertyValueAtPath(route, 'data.contentId');

        // Store last active URL prior to logout, so user can be redirected on re-login
        localStorage.setItem('returnUrl', JSON.stringify(state.url));

        // DO OTHER STUFF...

    }

在我的登录组件中,我只是将那个值传入...

login(response)
{
    this.loading = true;

    this.authenticationService.login(this.model.username, this.model.password, function (results)
    {
        if (results.data && results.ok === true)
        {
            this.returnUrl = JSON.parse(localStorage.getItem('returnUrl'));
            this.router.navigate([this.returnUrl || '/']);
            console.log('ReturnURL Value is: ', this.returnUrl);
            this.reset();
        }
        else
        {
            this.alertService.error(null, response);
            this.loading = false;
        }

    }.bind(this));
}

【讨论】:

    【解决方案2】:

    它是同步发生的。但是,您正在记录一个对象指针。当您在控制台中查看对象时,它已经发生了变化,因为路线已经改变。 我建议使用本地存储来存储路由器快照。这不会有您在控制台中看到的相同指针问题。

    【讨论】:

    • 啊,好吧,很有趣。我会试一试,谢谢。我没有意识到分配给局部变量会导致这个问题。
    • 不走运。结果相同。我会在我尝试过的上面发布。
    • 哦,对了。也许我错了。如果这不起作用,我将删除,但您是否尝试过 angular.copy 来创建变量的副本。
    • 其实,有个主意。打算尝试从我的 authGuard 文件保存到 localStorage。这可能有效...
    • 太棒了。当您导航离开时以及导航到页面时都有警卫。我假设你正在离开
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    相关资源
    最近更新 更多