我是 Angular 的新手,我很难找到这个问题的根源。
我正在编写一个单页应用程序,并且正在处理身份验证部分。我有一个名为“sessionService”的服务,我希望能够在整个应用程序中使用它来确定用户是否登录。如果我这样做很简单:
...service('sessionService', function(...) {
/*...snip...*/
this.isLoggedIn = function() {
return this.authenticated;
};
});
“经过身份验证”的地方只是服务私有的。但是,如果我刷新页面,它就会崩溃。所以,我的想法是做这样的事情:
/*...snip...*/
this.isLoggedIn = function() {
var deferred = $q.defer()
, self = this
;
function handleLoggedInStatus(status) {
if (status) {
self.authenticated = true;
deferred.resolve();
}
else {
deferred.reject();
}
}
if (this.authenticated === null) {
$http.get('/user')
.success(function(response) {
handleLoggedInStatus(response.success);
});
}
else {
handleLoggedInStatus(this.authenticated);
}
return deferred.promise;
};
然后在我的控制器中,我会做这样的事情:
$scope.isLoggedIn = sessionService.isLoggedIn;
在我的模板中,我会这样做:
...data-ng-show="isLoggedIn()"
但是,这样做会导致以下错误:
10 $digest() iterations reached. Aborting!
我尝试了几种不同的方法来引用 sessionService.isLoggedIn 函数,例如:
$scope.isLoggedIn = sessionService.isLoggedIn();
$scope.isLoggedIn = sessionService.isLoggedIn.bind(sessionService)();
$scope.isLoggedIn = function() { return sessionService.isLoggedIn() }
但他们要么没有工作,要么只是给了我同样的错误。
基本上,我只是希望能够返回一个承诺,告诉我用户是否登录。如果我们不知道他们是否登录(比如在页面刷新之后),承诺将在之后解决一个ajax请求。如果我们已经知道(就像在整个单页应用程序中正常导航一样),那么承诺将立即得到解决。然后我想在我的视图中使用它,以便我可以显示/隐藏某些内容,例如注销或查看帐户页面的链接。
我究竟做错了什么?