Подтвердить что ты не робот

Инъекционные услуги непосредственно в директивном контроллере AngularJS

Я понимаю, как инъекция зависимостей Angular работает с директивами, но хочет что-то уточнить. У меня есть фиктивная тестовая директива:

app.directive("test", [

  function() {

    return {
      restrict: "E",
      scope: {},
      controller: ["$scope", "$filter",
        function($scope, $filter) {
          var food = ["Apple pie", "Apple cobler", "Banana Split", "Cherry Pie", "Applesauce"];

          $scope.favorites = $filter('filter')(food, "Apple");
        }
      ],
      template: "<div>{{favorites}}</div>"
    }
  }
]);

Это отлично работает и будет фильтровать массив food, как и ожидалось. Однако я заметил, что если я введу службу $filter в директиве следующим образом, она все равно работает:

app.directive("test", ["$filter",

  function($filter) {

    return {
      restrict: "E",
      scope: {},
      controller: ["$scope",function($scope) {...

Мой вопрос: лучше ли внедрять службы в директиву в строке объявления так:

app.directive("test", ["$filter", function($filter) {

или в строке контроллера следующим образом:

controller: ["$scope", "$filter", function($scope, $filter) {?

Нет ли разницы? Вот Plunker директивного кода.

4b9b3361

Ответ 1

В этом случае вы получаете ту же услугу, поэтому, вероятно, это не имеет большого значения. Я лично предпочитаю держать их как можно более локализованными; если вам не нужно $filter в функции link или что-то в этом роде, я бы просто ввел его в контроллер.

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

Ответ 2

Вы также можете это сделать. Гораздо лучше, разделив директиву и ее контроллер в одном файле. Или вы можете писать в отдельных файлах. Но, лучше понять

app.directive('throbberDirective', 
[   
    function(){
        return {
            restrict: "EA",
            templateUrl: "common/utils/throbbers/throbber.html",
            controller: throbberController
        }
    }
]);
app.controller('throbberController', throbberController);
throbberController.$inject = ['$scope', '_$ajax'];
function throbberController($scope){
     $scope.throbber = _$ajax.getThrobberConfigs();
     $scope.throbber.templateName = $scope.throbber.templateName;

}