我在角度$timeout方面遇到问题。如果我不点击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");
}
}
假设您只在用户单击登录按钮时调用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
});