Javascript AngularJS将服务变量传递给控制器

Javascript AngularJS将服务变量传递给控制器,javascript,angularjs,Javascript,Angularjs,我构建了一个具有用户身份验证的简单应用程序,其基础是: 基本上,我有一个userAccountService,负责与服务器和处理登录过程的登录控制器通信 从另一个控制器,我想检查用户是否已经登录(隐藏登录按钮,而显示用户配置文件) 所以我有一个导航控制器 function navCtrl ($scope, $modal, userAccountService) { $scope.IsUserLoggedIn = function () { return userAcco

我构建了一个具有用户身份验证的简单应用程序,其基础是:

基本上,我有一个userAccountService,负责与服务器和处理登录过程的登录控制器通信

从另一个控制器,我想检查用户是否已经登录(隐藏登录按钮,而显示用户配置文件)

所以我有一个导航控制器

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。