Я полностью запутался в инъекции в Angular. Я не знаю, где его использовать и почему. Используется ли он только с factory как описанным здесь?
myController.$inject = ['$scope','notify'];
Здесь notify
- имя factory.
Я полностью запутался в инъекции в Angular. Я не знаю, где его использовать и почему. Используется ли он только с factory как описанным здесь?
myController.$inject = ['$scope','notify'];
Здесь notify
- имя factory.
Это один из подходов к поддержке 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 при объявлении контроллеров и т.д., поскольку его легче читать/понимать/перекрестно проверять, так как он все в одном месте.
Чтобы добавить комментарий @, важно отметить, что использование метода $inject в стиле:
MyController.$inject = ['$scope', 'notify'];
позволяет добавлять зависимости от инъекций при построении поставщиков, которые являются единственными angular рецептами, которые не позволяют разрешать "дружественный" стиль аннотации т.е.:
.controller('MyController', ['$scope', 'notify',...
зависимости, которые должны быть объявлены.
Способ использования $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 не сможет распознать код.
Обязательно использовать этот формат, если у нас есть атрибут ng-strict-di