Я не понимаю использование $inject в контроллерах


Я совершенно запутался насчет инъекции в угловой. Я не знаю, где его использовать и почему. Он используется только с фабрикой как описано здесь?

myController.$inject = ['$scope','notify'];

здесь notify - это название завода.

4 59

4 ответа:

это один из подходов к поддержке инъекции зависимостей после того, как ваш код будет минимизирован (если вы решите минимизировать).

при объявлении контроллера функция принимает параметры:

function ($scope, notify)

когда вы сократите код, ваша функция будет выглядеть так:

function (a, b)

поскольку AngularJS использует имена параметров функции для вывода DI, ваш код будет сломан, потому что AngularJS не знает о a или b.

решить эту проблему, они предоставили дополнительные способы объявления контроллеров (или других служб / фабрик / и т. д.) По этому вопросу:

  1. для контроллеров, используйте $inject метод - здесь вы передаете массив литералов, которые сопоставляются с параметрами функции контроллера. Так что, если вы предоставляете

    ['$scope', 'notify']
    

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

  2. при объявлении новых контроллеров, сервисов и т. д., Вы можете использовать синтаксис литерала массива. Здесь, вы делаете что-то вроде этого:

    angular.module('myModule').controller('MyController', ['$scope', 'notify', function ($scope, notify) {
        ...
    }]);
    

    массив в качестве параметра функции контроллера сопоставляет объекты DI с параметрами вашей функции.

Я предпочитаю вариант #2 при объявлении контроллеров и т. д., поскольку его легче читать/понимать/перепроверять, поскольку все это находится в одном и том же месте.

В дополнение @Марк ответ, Важно отметить, что с помощью метода $inject в стиле:

MyController.$inject = ['$scope', 'notify'];

позволяет добавлять зависимости инъекций при построении поставщики которые являются единственными угловыми рецептами, которые не разрешить "дружественный" стиль аннотаций т. е.:

.controller('MyController', ['$scope', 'notify',... 

зависимости, которые будут объявлены.

как вы должны использовать $inject - это:

function ApplicationController($scope){
    $scope.greet = "Foo is Not Great!5";
}

ApplicationController.$inject = ['$scope','$ionic'];

app.controller('ApplicationController', ApplicationController);

нам нужно это как защитить код от uglifying или минимизация.

function(firstName,lastName) может стать function(n,m).

так что для AngularJS он сломает код, потому что $scope может быть заменен на 's'. Это потому, что без $ подписать angularJS не сможет распознать код.

это обязательно использовать этот формат, когда мы имеем ng-strict-di атрибут