Javascript AngularJS将服务变量传递给控制器
我构建了一个具有用户身份验证的简单应用程序,其基础是: 基本上,我有一个userAccountService,负责与服务器和处理登录过程的登录控制器通信 从另一个控制器,我想检查用户是否已经登录(隐藏登录按钮,而显示用户配置文件) 所以我有一个导航控制器Javascript AngularJS将服务变量传递给控制器,javascript,angularjs,Javascript,Angularjs,我构建了一个具有用户身份验证的简单应用程序,其基础是: 基本上,我有一个userAccountService,负责与服务器和处理登录过程的登录控制器通信 从另一个控制器,我想检查用户是否已经登录(隐藏登录按钮,而显示用户配置文件) 所以我有一个导航控制器 function navCtrl ($scope, $modal, userAccountService) { $scope.IsUserLoggedIn = function () { return userAcco
function navCtrl ($scope, $modal, userAccountService) {
$scope.IsUserLoggedIn = function () {
return userAccountService.isUserLoggedIn;
}
}
$scope.IsUserLoggedIn = userAccountService.getData().isUserLoggedIn;
所以在HTML中,我使用这个nghide=“isUserLoggedIn()
我的用户帐户服务:
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;
}
}
我做错了什么?我从另一本有趣的读物中得到了灵感:你不能返回变量,但你可以返回函数,所以创建一个返回该变量的函数 尝试这样的操作,它将返回您的服务对象(您可能希望在其上放置$watch): 服务
function userAccountService($http, $q) {
function getData() {
return service;
}
...
}
控制器
function navCtrl ($scope, $modal, userAccountService) {
$scope.IsUserLoggedIn = function () {
return userAccountService.isUserLoggedIn;
}
}
$scope.IsUserLoggedIn = userAccountService.getData().isUserLoggedIn;
此外,您没有正确更新成功回调中的状态变量-您正在创建全局变量,而不是使用服务对象属性。例如:
isUserLoggedIn = true;
应该是:
service.isUserLoggedIn = true;
我们不知道你做错了什么,因为你没有告诉我们你的问题是什么。你期望什么行为?发生了什么?仍然不起作用-我把
console.log(服务)
到$http。登录用户-isUserLoggedIn中的success设置为true。我将getData函数和控制器中的行与您在此处编写的相同。然后,发生了什么?我不确定是否能够捕获您编写的所有内容。打印到控制台的服务对象具有属性isUserLoggedIn:true
,但在我的导航控制器中,$scope.IsUserLoggedIn=userAccountService.getData().isUserLoggedIn
仍然为false。我添加了console.log()do getData()函数,它似乎从未被调用。有没有可能在JSFIDLE或plnkr中复制它?请注意,我还在更新登录函数中的$scope.IsUserLoggedIn…我想这是可以的,但如果您愿意,可以在那里使用$watch。