Как мне ввести CurrentUser в контроллер

Я очень новичок в angular и пытаюсь создать контроллер, который получит все Snods, принадлежащие текущему пользователю. Я включил свой 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;
        });
    });
}

person Mark Fee    schedule 06.06.2014    source источник
comment
Почему вы думаете, что это неправильно?   -  person Chandermani    schedule 06.06.2014
comment
С момента публикации я не уверен, что делаю. Я больше ориентируюсь на объекты и меньше на функционального программиста, поэтому вложенные вызовы казались неестественными. Я просто хотел избежать ошибок новичка и необходимости разбирать все это позже.   -  person Mark Fee    schedule 06.06.2014


Ответы (1)


ваш код, конечно, работает, но только для стиля кода это не элегантно, потому что он построен таким образом, что всегда требует вложения обратного вызова в другой...

Чтобы решить эту проблему, вы можете посмотреть, как работают промисы и как они реализованы в AngularJS:

  1. ПРОМИСЫ ES6
  2. $q
  3. Promises в ngResource

Таким образом, после прочтения этих страниц у вас должны появиться более четкие представления о том, как решить раздражающий вопрос Пирамида гибели.

Давайте быстро переработаем ваш базовый код:

// 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);
and, in your controller you can do:

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

Еще одна замечательная вещь может состоять в том, чтобы реорганизовать ваш код, пытаясь понять, какие зависимости есть у вашего контроллера... Для меня, например, значение CurrentUser является зависимостью, и его следует поместить в route-resolve (разрешения объясняются здесь ).

Используя resolve, вы можете сделать это напрямую:

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

Надеюсь, поможет!

person Hitmands    schedule 12.12.2015