我遇到角度$超时问题。它工作正常如果我不会按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");
}
}
答案 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
});