【问题标题】:AngularJS pass service variable to controllerAngularJS 将服务变量传递给控制器
【发布时间】:2014-05-09 09:11:28
【问题描述】:

我在此基础上构建了一个带有用户身份验证的简单应用程序:link

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

从其他控制器我想检查用户是否已经登录(隐藏登录按钮,并显示用户配置文件)。

所以我有一个导航控制器

function navCtrl ($scope, $modal, userAccountService) {

    $scope.IsUserLoggedIn = function () {
        return userAccountService.isUserLoggedIn;
    } 

}

所以在 HTML 中我使用 ng-hide="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;
    }
}

我做错了什么?这是我从中获得灵感的另一篇有趣的读物:link

【问题讨论】:

  • 我们不知道您做错了什么,因为您没有告诉我们您的问题是什么。你期待什么行为?发生了什么?

标签: javascript angularjs


【解决方案1】:

你不能返回一个变量,但你可以返回一个函数,所以创建一个返回该变量的函数。

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

服务

function userAccountService($http, $q) {

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

控制器

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

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

isUserLoggedIn = true;

应该是:

service.isUserLoggedIn = true;

【讨论】:

  • 仍然不起作用 - 我将console.log(service) 放入 loginUser 中的 $http.success - isUserLoggedIn 设置为 true。我把 getData 函数和我的控制器放在你在这里写的同一行。
  • 然后,会发生什么?我不确定我是否能听懂你写的所有内容。
  • 打印到控制台的服务对象具有属性isUserLoggedIn: true,但在我的导航控制器中,$scope.IsUserLoggedIn = userAccoutnService.getData().isUserLoggedIn 仍然是错误的。我添加了 console.log() 做 getData() 函数,它似乎从来没有被调用过。
  • 你可以在 jsfiddle 或 plnkr 中复制它吗?
  • 请注意,我还在您的登录功能中更新了 $scope.IsUserLoggedIn... 我猜这没问题,但如果您愿意,您可以在那里使用 $watch。
猜你喜欢
  • 2014-09-28
  • 2014-05-01
  • 2019-06-02
  • 2012-07-27
  • 1970-01-01
  • 2013-06-15
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多