6

Просто изучайте инъекцию зависимостей, и я думаю, что я начинаю это понимать.Понимание инъекции зависимостей в контроллерах AngularJS

Пожалуйста, скажите мне, если я на правильном пути ...

т.д .: Являются ли эти два эквивалентны?

/* injection method */ 
function <controller_name>($scope) {} 
<controller_name>.$inject = ['$scope']; 

/* other method */ 
var app = angular.module('myApp'); 
app.controller(<controller_name>, function($scope) {}); 

ответ

12

Сначала немного уточнение:

Для инъекции зависимостей, это не имеет значения, объявить ли контроллер, используя глобальную функцию или в качестве аргумента module.controller(...) метода. Инжектор зависимости зависит только от самой функции. Так что вы на самом деле просят о том, эквивалентность этих двух:

// First 

function MyController($scope) {} 

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

// Second 

function($scope) {} 

И потому ли анонимна функция контроллера или нет, также не имеет значения для инжектора, выше два точно так же может быть:

// First 

function MyController($scope) {} 

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

// Second 

function MyController($scope) {} 

Теперь стало ясно, что единственное различие между вашими двумя контроллерами является наличие $inject собственности в одном из них.

А вот фактический ответ на ваш вопрос:

Эти два контроллера почти то же самое. Оба получат $scope в качестве аргумента и будут работать одинаково. Однако, если вы решите позже сократить свой код, будет установлена ​​только версия с установленным на ней массивом $inject. Это связано с тем, что если вы не укажете массив $inject или не используете встроенный подход аннотации (http://docs.angularjs.org/guide/di#inlineannotation), единственный способ для инжектора выяснить, какие зависимости вы заинтересовали, - проверить имена аргументов функции (рассматривая их как идентификаторы служб). Но минимизация будет называть эти аргументы случайным образом, таким образом удаляя возможность распознавать зависимости таким образом.

Итак, если вы собираетесь минимизировать свой код, вы должны явно указать зависимости с помощью массива $inject или встроенной аннотации, иначе любая версия будет работать так же хорошо.

7

Если вы собираетесь использовать метод module.controller, эквивалент первого примера будет:

var app = angular.module('myApp'); 
app.controller(<controller_name>, ['$scope', function($scope) {}]); 

Обратите внимание, что этот путь мы проходим в $inject строку вместе с функцией, так что если он позже будет сведен к минимуму, он все равно будет работать.

+0

Спасибо, но это не работает с '$ http' ... спросил об этом здесь: http://stackoverflow.com/q/16664325 – user2283066

Смежные вопросы