2013-10-13 4 views
1

Я здесь angularJS noob, и, основываясь на моем понимании, есть два места, где я могу вводить зависимость.AngularJS Dependency Injection, где указать?

angular.module('myApp', [A: HERE IS ONE PLACE TO DO IT]) 
.controller('HomeController', function(B: $hereIsAnotherPlace){ 

}); 

Я прав? Если да, то каковы различия?

+2

'ONE PLACE TO DO IT' на самом деле является местом для добавления модулей – SET

ответ

1

Где вы задаете «ЗДЕСЬ ОДНО МЕСТО СДЕЛАТЬ ЭТО» на самом деле, где вы можете вводить различные модули в другой модуль, вот пример.

var helperModule = angular.module('helperModule', []); 

var pageModule = angular.module('pageModule', ['helperModule']); 

pageModule теперь имеет доступ ко всем услугам & директивы .. и т.д., связанные с helperModule

А где вы указываете этот

function(B: $hereIsAnotherPlace){ ... 

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

Вот два способа, которыми вы можете воспользоваться услугами.

.controller('myController', function($myService) { ... }); 

Или для уточнения кода, который вы использовали бы.

.controller('myController', ['$myService', function($myService) { ... }]); 

в последнем примере вы можете изменить имя $myService в arguments на что угодно.

Быстрого Пример

.controller('myController', ['$myService', function($thisIsEqualTo$myService) { ... }]); 

Так что последний 2 пример идентичны, при использовании массива для указания уколов, аргументы можно назвать то, как они передаются в порядке, что вы требуете их в Массив.

+0

Можете ли вы подробнее рассказать о том, что вы подразумеваете под« вы можете изменить имя $ myService в аргументах на что угодно » – denniss

+0

Да, конечно, обновить сейчас. – iConnor

0

A используется только при создании вашего модуля и должен использоваться только один раз в вашем приложении.

angular.module('myApp', [A: HERE IS ONE PLACE TO DO IT]); 

B не является для инъекций в контроллер ...

angular.module('myApp') 
.controller('HomeController', function(B: $hereIsAnotherPlace){ 

}); 

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

2

В вашем примере, где вы можете указать модули, а не инъекции зависимостей (DI). Ниже рассматриваются это изменение кода:

.controller('HomeController', [A , function(B) {}]); 

Второй (В) требуется, первый (А) не является обязательным (но описано ниже преимущества).

Вот пример только с использованием только второй (В) от угловой документации:

function MyController($scope, greeter) {...}' 

Но Javascript minifiers и обфускаторы могут переименовывать параметры и разорвать этот подход, поскольку угловые предпологает, например, $ возможности для быть названным точно $ scope (и minifiers, например, чтобы переименовать параметры как можно меньше, чтобы уменьшить размер файла как можно меньше).

Один из способов, среди прочего, вокруг которого является рядной аннотацией:

someModule.factory('greeter', ['$window', function(renamed$window) {...}]); 

(опять из угловых Docs). Это оборачивается проблемой, поскольку мини-игроки/не изменят строковый литерал. И угловой знает, чтобы ввести службу с этим именем строки в согласованный параметр внутри функции. Таким образом, имя параметра может быть изменено на что-либо с помощью minifier, и все это хорошо, так как единственное, что имеет значение, - это позиция сервиса в списке строк/параметров (первая строка соответствует первому параметру и т. Д.).

Для многое другое на инъекции зависимостей: http://docs.angularjs.org/guide/di