Преимущества инъекции зависимостей (DI) больше не будут обсуждаться, и те, кто использовал Spring Framework, знают это. В качестве структуры JS переднего плана AngularJS также обеспечивает поддержку DI, которая является функцией, которой нет JavaScript/jQuery. DI, связанные с AngularJs, включают Angular.Module (), Angular.Injector (), $ инжектор и $ предоставление. Для контейнера DI он должен иметь три элемента: регистрация обслуживания, объявление зависимости и приобретение объектов. Например, весной регистрация службы реализована через тег <Bean> файла конфигурации XML или аннотацию @Repository, @Service, @Controller и @Component; Приобретение объекта может быть реализовано ApplicationContext.getBean (); Объявление о зависимостях может быть настроено в файле XML, или оно может быть объявлено в коде Java с использованием @Resource и других аннотаций. В угловых, модуле и $ предоставлены эквивалентны регистрации услуги; Инжектор используется для получения объектов (Angular автоматически завершает инъекцию зависимостей); Есть 3 способа объявить зависимости в угловых. Ниже приведено введение в Angular DI из этих 3 аспектов.
1. angular.module () создает, получает и регистрирует модули в угловой
Angular.Module () - это глобальное место для создания, регистрации и извлечения угловых модулей. Когда пройдет два или более аргументов, создается новый модуль. При передаче только одного аргумента, существующий модуль (имя, переданное как первый аргумент в модуль), получен.
// прохождение более одного параметра означает новый модуль; Пустой массив означает, что модуль не полагается на другие модули var createmodule = angular.module («mymodule», []); // Существует только один параметр (название модуля), что означает, что модуль // Если модуль не существует, угловой структуру будет выбросить исключение varmodule = nerulale. оповещение (CreateModule == getModule);
Эта функция может создавать новые модули или получить существующие модули. Создавать или получить, это отличается количеством параметров.
Angular.Module (имя, [требуется], [configfn]);
Имя: Тип строки, представляющий имя модуля;
Требуется: массив строк, представляющий список других модулей, от которых зависит модуль. Если вы не полагаетесь на другие модули, используйте пустой массив;
configfn: используется для создания некоторых конфигураций в этом модуле.
Теперь мы знаем, как создавать и получить модули, так что же такое модули? В официальном руководстве разработчика есть только одно предложение: вы можете думать о модуле как контейнера для различных частей контроллеров ваших приложений, услуг, фильтров, директив и т. Д. Я не совсем понимаю это сейчас. Это примерно означает, что модуль представляет собой набор некоторых функций, таких как целое, состоящее из детских элементов, таких как контроллеры, услуги, фильтры, инструкции и т. Д. Я не могу объяснить это сейчас, поэтому я оставлю его сначала.
2. Отношения между $ предоставления и модуля
Услуга $ предоставляет ряд методов регистрации компонентов с помощью инжектора $. Многие из этих функций также выставлены на Angular.Module.
Как упоминалось ранее: модуль и предоставление используются для регистрации услуг в инжектор. Проверьте официальный API, и вы можете увидеть, что $ предоставляет предоставление предоставления (), constant (), value (), factory () и service () для создания услуг различных народ; Angular.Module также предоставляет эти 5 методов регистрации услуг. Фактически, функции двух одинаковы, что используется для регистрации служб с помощью контейнера DI в инжектор.
Auto в соответствии с официальным API включает в себя $ предоставление и инжектор $, неявный модуль, который автоматически добавляется в каждый инжектор $. Буквально, каждый инжектор имеет эти 2 неявные услуги. Но в версии 1.2.25 я чувствую, что нет способа предоставить $ в инжекторе. Я не знаю, почему это? Вообще говоря, вам не нужно отображать эту услугу, просто используйте API, предоставленный в модуле.
var injector = angular.injector (); alert (injector.has ("$ предоставлять")); // falsealert (injechor.has ("$ injechor")); // true3. angular.injector ()
Вы также можете получить инжектор с использованием angular.injector (); Но это не связано с модулем. Этот подход бессмыслен, он эквивалентен созданию пустого контейнера DI, и в нем нет услуг, как другие могут его использовать? Правильным способом является указание модулей, которые необходимо загрузить при создании инжектора.
// Создание модуля MyModule и зарегистрируйте службу var mymodule = angular.module ('mymodule', []); mymodule.service ('myservice', function () {this.my = 0;}); // Создать модуль hermodule и зарегистрировать сервис var hermodule = ingular.mular ('hermodule'. []); hermodule.service ('herservice', function () {this.her = 1;}); // загрузить сервис var injector = angular.injector (["mymodule", "hermodule"]); ulert (injector.get ("myservice"). My); Alert (injector.get ("herservice").Если загружаются несколько модулей, службы в нескольких модулях могут быть получены через возвращенный инжектор. В этом примере, если загружается только Mymoudle, полученный инжектор не может получить доступ к Сервисам под Hermoudle. Особенно важно отметить здесь: Angular.Injector () можно называться несколько раз, и каждый раз, когда он возвращает недавно созданный объект инжектора.
var injector1 = angular.injector (["mymodule", "hermodule"]); var injector2 = angular.injector (["mymodule", "hermodule"]); alert (injector1 == injector2); // Неверно
4. Три способа объявить зависимости в угловых
Angular обеспечивает три способа получения зависимостей: вывод, аннотацию и встроенные методы.
// Создать модуль MyModule и зарегистрировать службу var mymodule = angular.module ('mymodule', []); mymodule.service ('myservice', function () {this.my = 0;}); // get injervvar injector = angular.injector (["mymodule"]); inferenceinjector.invoke (function (myservice) {alert (myservice.my);}); // вторая аннотационная функция explicit (servicea) {alert (servicea.my);}; explicit. $ inject = ['myservice']; injector.invoke (explicit); inlineinjector.invoke (['myservice', function (servicea) {alert (servicea.my);}]);Среди них аннотация и встроенные методы не требуют имени параметра функции, которое рекомендуется; Метод вывода требует, чтобы имя параметра и имя службы были согласованы. Если код JS сжат или запутан, то с функцией будут проблемы, и этот метод не рекомендуется.
Выше приведено сборник информации, введенной зависимостью AngularJS. Мы будем продолжать добавлять соответствующую информацию в будущем. Спасибо за поддержку этого сайта!