我构建了一个基于此用户身份验证的简单应用:link
基本上,我有一个userAccountService,负责与处理登录过程的服务器和登录控制器进行通信。
从其他控制器我想检查用户是否已登录(隐藏登录按钮,改为显示用户配置文件)。
所以我有一个navController
function navCtrl ($scope, $modal, userAccountService) {
$scope.IsUserLoggedIn = function () {
return userAccountService.isUserLoggedIn;
}
}
所以在HTML中我使用这个ng-hide="isUserLoggedIn()
我的userAccountService:
app.factory('userAccountService', ['$http', '$q', userAccountService]);
function userAccountService($http, $q) {
var service = {
registerUser: registerUser,
loginUser: loginUser,
logOut: logOut,
getValues: getValues,
isUserLoggedIn: false,
accessToken: ""
};
// code ommited
function loginUser(userData) {
var tokenUrl = serverBaseUrl + "/Token";
if (!userData.grant_type) {
userData.grant_type = "password";
}
var deferred = $q.defer();
$http({
method: 'POST',
url: tokenUrl,
data: userData,
})
.success(function (data,status,headers,cfg) {
// save the access_token as this is required for each API call.
accessToken = data.access_token;
isUserLoggedIn = true;
// check the log screen to know currently back from the server when a user log in successfully.
console.log(data);
deferred.resolve(data);
})
.error(function (err, status) {
console.log(err);
deferred.reject(status);
});
return deferred.promise;
}
}
我做错了什么?这是另一个有趣的读物,我从中获取灵感:link
答案 0 :(得分:2)
您不能返回变量,但可以返回一个函数,因此创建一个返回该变量的函数。
尝试这样的事情,它会返回你的服务对象(你可能想要把一个$ watch放在上面):
服务
function userAccountService($http, $q) {
function getData() {
return service;
}
...
}
控制器
$scope.IsUserLoggedIn = userAccountService.getData().isUserLoggedIn;
此外,您没有正确地从成功回调中更新状态变量 - 您正在创建全局变量而不是使用服务对象属性。所以,例如:
isUserLoggedIn = true;
应该是:
service.isUserLoggedIn = true;