Angular 1.6:工厂问题初始化值

时间:2017-11-01 10:25:33

标签: javascript angularjs angular1.6

我对Angular 1有下一个'问题'。

我使用工厂来获取当前登录用户的数据:

angular.module('myModule')
  .factory('authFactory', function ($http, $rootScope, Session, api, backend_url) {
    var authFactory = this;
    var user = {};

    authFactory.init = function(){
        // This API returns the information of the current user
        api.current_user.get({}).$promise.then(function(res){
          user = res;
        });
    }

    // I use this function to return the user
    authFactory.user = function () {
         return user;
    };
  }

这是一个基本的控制器示例,我正在尝试访问上述工厂检索到的信息:

angular.module('myModule.mypage')
.controller('PageCtrl', function ($scope, authFactory) {     
  $scope.user = authFactory.user();
  authFactory.init();

  angular.element(document).ready(function () {
      // This will return {} because it's called
      // before the factory updates user value
      console.log(authFactory.user());
      console.log($scope.user);
  });
});

问题是,一旦Factory检索用户值, $ scope.user = myFactory.user(); 就不会更新。

我认为我的问题与 myFactory.user(); 有关。我正在使用一个函数,所以函数返回的值在 myFactory.user 发生变化后没有更新,我认为这就是 PageCtrl 变量 $的原因scope.user 没有获得任何价值。

我的问题是:

  • 我的控制器上等待 authFactory 加载用户信息的最佳方法是什么?

  • 我应该使用服务吗?

2 个答案:

答案 0 :(得分:1)

您的实现问题是在使用可能的异步API调用user时正在初始化authFactory.init()

我建议你从authFactory.user方法返回承诺。

angular.module('myModule')
.factory('authFactory', function ($http, $rootScope, Session, api, $q, backend_url) {
    var authFactory = this;
    var user = {};

    authFactory.init = function () {
        // This API returns the information of the current user
        return api.current_user.get({}).$promise.then(function (res) {
            user = res;
        });
    }

    //Return promise from the method
    authFactory.user = function () {
        var deferred = $q.defer();
        if (angular.isDefined(user)) {
            deferred.resolve(user);
        } else {
            authFactory.init().then(function () {
                deferred.resolve(user);
            });
        }
        return deferred.promise;
    };
});

然后修改控制器

angular.module('myModule.mypage')
.controller('PageCtrl', function ($scope, authFactory) {
    authFactory.user().then(function (user) {
        $scope.user = user;
    })
});

答案 1 :(得分:0)

angular.module('myModule')
  .factory('authFactory', function ($http, $rootScope, Session, api, backend_url) {
    var authFactory = this;

    authFactory.user = {}

    // I use this function to return the user
    authFactory.getUser() = function () {
          return api.current_user.get({}).$promise.then(function(res){
               authFactory.user = res;
          });
    };
  }


angular.module('myModule.mypage')
.controller('PageCtrl', function ($scope, authFactory) {     
  authFactory.getUser().then(function() {
       $scope.user = authFactory.user;
  });
});

为我们提供一个JSFiddle,我试图在没有任何测试环境的情况下帮助您。