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

时间:2014-03-29 22:24:39

标签: javascript angularjs

我构建了一个基于此用户身份验证的简单应用: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

1 个答案:

答案 0 :(得分:2)

您不能返回变量,但可以返回一个函数,因此创建一个返回该变量的函数。

尝试这样的事情,它会返回你的服务对象(你可能想要把一个$ watch放在上面):

服务

function userAccountService($http, $q) {

  function getData() {
      return service;
  }
  ...
}

控制器

$scope.IsUserLoggedIn = userAccountService.getData().isUserLoggedIn;

此外,您没有正确地从成功回调中更新状态变量 - 您正在创建全局变量而不是使用服务对象属性。所以,例如:

isUserLoggedIn = true;

应该是:

service.isUserLoggedIn = true;