刷新后的angular $ timeout

时间:2014-11-11 17:43:44

标签: javascript angularjs timeout typescript

我遇到角度$超时问题。它工作正常如果我不会按F5 /重新加载页面。当我重新加载页面时,超时停止,从不调用我在超时时提供的功能。我觉得代码很好,但我错过了一些东西。为什么刷新页面时永远不会超时?

export class AccountController
{

    constructor(private $scope: ControllerScope, private $location: ng.ILocationService, private AuthService: AuthService, private $timeout: ng.ITimeoutService)
    {

    }

    public Login(model: LoginModel)
    {
        this.AuthService.login(model).then((response: any) =>
        {
            //when token will expire -> logout
            this.$timeout(() =>
            {
                this.Logout();
            }, <number>response.TokenExpireTime).then((d) =>
            {
                alert('Czas trwania sesji wygasł');
            });

            this.$location.path('/');
        },
        (err) =>
        {
            alert(err.error_description);
        });

    }

    public Logout()
    {
            this.AuthService.logOut();
            this.$location.path("/login");
    }

}

1 个答案:

答案 0 :(得分:1)

好吧,假设您只在用户点击登录按钮后拨打LOGIN,这就是解释。

当您注册$ timeout时,刷新浏览器后将删除它。这是标准行为,只是它在浏览器环境中的工作方式。

即 - 在新页面刷新时,当用户已登录时,您不再调用login方法。这意味着您不再次注册$ timeout,刷新后,浏览器不知道您是否想要使用它。

一种解决方案可能是更改该代码以在每次加载页面时注册$ timeout,但是进一步查看代码,您可以将TokenExpireTime设置为例如localStorage内的变量,并在其他地方使用它。

设置localStorage ['expires']的示例。

if (localStorage['expires']) {
   $timeout(function() {
      // do your thing, if you are not going to update model, keep 3rd parameter false,
      // otherwise skip it to prevent $digest cycle from running
   }, localStorage['expires'], false);
}

这类似于银行会议,无论你在做什么,都会在15分钟后退出。

如果您想在用户访问其他网页时重置超时或仅与您的应用进行互动,则需要通过添加例如焦点事件。

$(window).on('focusin', function() {
    // clear timeout, user is back in your app
});

$(window).on('focusout', function() {
   // register timeout, user is away
});