AngularJS: проблема минификации в директиве

У меня еще одна проблема с минификацией. На этот раз это из-за того, что служба $ scope передана контроллеру директивы. См. Ниже код:

angular.module('person.directives').
directive("person", ['$dialog', function($dialog) {
return {
    restrict: "E",
    templateUrl: "person/views/person.html",
    replace: true,
    scope: {
        myPerson: '='
    },     
    controller: function ($scope)
    {                   
        $scope.test = 3;                   
    }
}
}]);

Если я закомментирую часть контроллера, то все работает нормально.

Как видите, я использовал объявление массива для директивы, поэтому служба $ dialog известна Angular даже после минификации. Но как я должен это сделать для службы $ scope на контроллере?


person Sam    schedule 17.04.2013    source источник


Ответы (2)


Вам нужно объявить контроллер следующим образом:

controller: ['$scope', function ($scope)
    {                   
        $scope.test = 3;                   
    }]

Полный пример здесь:

angular.module('person.directives').
directive("person", ['$dialog', function($dialog) {
return {
    restrict: "E",
    templateUrl: "person/views/person.html",
    replace: true,
    scope: {
        myPerson: '='
    },     
    controller: ['$scope', function ($scope)
    {                   
        $scope.test = 3;                   
    }]
}
}]);

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

person pkozlowski.opensource    schedule 17.04.2013
comment
это решение, предоставленное мной :) Sam = OP ;-) Однако я не раскрываю контроллер для всего приложения, а только для всего модуля, которому принадлежит директива. Но мне нравится ваш подход, я пойду на это. - person Sam; 17.04.2013
comment
Фактически, раскрытие его одному модулю AngularJS будет означать, что любой модуль AngularJS будет иметь к нему доступ - это то, что я имел в виду, открывая его для всего приложения. - person pkozlowski.opensource; 17.04.2013
comment
Модули AngularJS будут иметь доступ к модулю person.controllers, только если они зависят от него. Если у них нет этой зависимости, они не смогут получить к ней доступ. Не так ли? - person Sam; 17.04.2013
comment
Нет, в текущей версии AngularJS эти контроллеры будут доступны глобально, во всем приложении. - person pkozlowski.opensource; 17.04.2013
comment
Вау, это меня на какое-то время поставило в тупик! Спасибо - person Rob B; 07.01.2014
comment
Отличное решение, чтобы обернуть его вот так ... Спасибо за это. - person error505; 07.11.2016

хорошо, в итоге я создал контроллер в отдельном файле:

angular.module('person.controllers').controller('personCtrl', ['$scope', function ($scope) {
$scope.test = 3;
}]);

затем в директиве я назначаю контроллер по имени:

controller: 'personCtrl'

Не уверен, что это лучший способ. Хотя он выглядит чистым. Что вы думаете ?

person Sam    schedule 17.04.2013
comment
Это сработает, но это будет означать раскрытие контроллера директивы всему приложению, в чем нет необходимости. - person pkozlowski.opensource; 17.04.2013