我应该如何将CurrentUser注入控制器

时间:2014-06-06 07:35:12

标签: angularjs angularjs-resource

我对角度很新,并且尝试创建一个控制器,它将获得属于当前用户的所有Snod。我已经包含了我的CurrentUserController以供参考,但我的问题是关于SnodController,是我注入CurrentUser并嵌套调用正确的方式,因为虽然它有效但我看起来不对。

道歉,如果这是一个争论和违反规则的问题,但我想知道我是否正朝着正确的方向前进。

var apiService = angular.module("apiService", ['ngResource']);
apiService.factory('CurrentUser', function($resource) {
    return $resource(   "http://snodbert/api/v1/users/current/",   {});
});

apiService.factory('Snod', function($resource) {
    return $resource
    (   "http://snodbert/api/v1/snods/:filter/:filterid",   {}
        ,   {   'update': { method:'PUT' }
        }
    );
});

function CurrentUserController($scope, CurrentUser) {
    var user = CurrentUser.get(function() {
            $scope.user=user;
        }
    );
}

function SnodController($scope, Snod, CurrentUser) {
    var user = CurrentUser.get(function() {
        var items = Snod.get( {filter:'owner', filterid: user.id},
        function() {
            $scope.items=items.data;
        });
    });
}

1 个答案:

答案 0 :(得分:1)

你的代码当然是有效的,但是,代码风格并不优雅,因为它的构建方式总是需要将回调嵌套到另一个...

为了解决这个问题,您可以了解Promise如何工作以及如何在AngularJS中实现它们:

  1. ES6 PROMISES
  2. $q
  3. Promises in ngResource
  4. 因此,在阅读这些页面之后,您应该在如何解决Pyramid of doom 这个恼人的问题时有更明确的想法。

      

    让我们快速修改您的基本代码:

    
    
    // old
    apiService.factory('CurrentUser', function($resource) {
        return $resource(   "http://snodbert/api/v1/users/current/",   {});
    });
    
    // new
    function CurrentUserServiceFactory($resource, $q) {
      var resource = $resource("http://snodbert/api/v1/users/current/", {});
      var self = this;
      
      self.get = function() {
        return resource
          .get()
          .$promise
        ;
      }
    }
    apiService.service('CurrentUserService', CurrentUserServiceFactory);
    
    
    
 并且,在您的控制器中,您可以:

    
    
    function SnodController($scope, Snod, CurrentUserService) {
      CurrentUserService
        .get()
        .then(function(userResult) {
          return Snod.get({}).$promise;
        })
        .then(function(snodResult) {
          console.log(snodResult);
        })
      ;
    }
    
    
    

    另一件好事可能是重新组织你的代码,试图了解你的控制器有哪些依赖...对我来说,例如,CurrentUser的值是一个依赖,它应该放在一个 route-resolve resolves are explained here)。

    使用resolve,您可以直接执行此操作:

    
    
    function SnodController($scope, Snod, CurrentUser) {
      Snod
        .get({userId: CurrentUser.id})
        .$promise
        .then(function(snodResult) {
          console.log(snodResult);
        })
      ;
      
    }
    
    
    

    希望它有所帮助!