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

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

Я полностью запутался в инъекции в Angular. Я не знаю, где его использовать и почему. Используется ли он только с factory как описанным здесь?

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

Здесь notify - имя factory.

4b9b3361

Ответ 1

Это один из подходов к поддержке Injection Dependency после того, как ваш код был уменьшен (если вы решили минимизировать).

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

function ($scope, notify)

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

function (a, b)

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

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

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

    ['$scope', 'notify']
    

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

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

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

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

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

Ответ 2

Чтобы добавить комментарий @, важно отметить, что использование метода $inject в стиле:

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

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

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

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

Ответ 3

Способ использования $inject:

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

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

app.controller('ApplicationController', ApplicationController);

Мы должны это сделать, чтобы защитить код от uglify или минимизации.

function(firstName,lastName) может превратиться в function(n,m).

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

Ответ 4

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