Циклическая зависимость приложения / поставщика

#angularjs #provider

#angularjs #поставщик

Вопрос:

Я хочу использовать поставщика для установки некоторых параметров конфигурации при запуске моего приложения AngularJS, но я хотел бы, чтобы приложение и поставщик были в 2 отдельных файлах.

Вот как у меня это сейчас:

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

myApp.config(function(myServiceProvider) {
....etc.
  

Поставщик определяется следующим образом:

 angular.module('myApp').provider('myService', function () {
...etc.
  

Если я загружаю приложение первым, провайдера еще нет, а если я загружаю провайдера первым, приложения еще нет.
Каков был бы наилучший способ решить эту проблему?

Ответ №1:

Определение вашего модуля включает в себя модульные зависимости, а не службы или поставщиков.

Это должно быть:

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

Блок конфигурации всегда выполняется после инициализации ваших поставщиков. Проблемы с циклической зависимостью нет.

Файл 1: Определение модуля

 angular.module('myApp', []);
  

Файл 2: определение поставщиков

 angular.module('myApp').provider('myService',function() {...});
  

Файл 3: Определение блока конфигурации

 angular.module('myApp').config(function(myServiceProvider) { ... });
  

HTML:

 <script src="/angular.js"></script>
<script src="/file1.js"></script>
<script src="/file2.js"></script>
<script src="/file3.js"></script>
  

Порядок файлов важен.

Комментарии:

1. мой плохой, но удаление этого по-прежнему создает ту же проблему, вероятно, из-за того, что MyApp.config требует его внедрения

2. В вашем определении модуля должен быть пустой массив модулей в качестве зависимости. В противном случае вы пытаетесь получить модуль, который еще не был определен.

3. да, извините, но тогда все та же проблема.

4. Ах, я думаю, я знаю, в чем проблема. У вас не может быть определения модуля и вызова метода конфигурации в одном файле. Поставщик еще не определен.

5. @Maarten: Примечание : многое изменилось в версии Angular 1.3.0-beta.8 и более поздних версиях. Начиная с этой версии, .config() блоки выполняются после загрузки служб и т.д., Поэтому порядок появления не играет роли. Смотрите также эту короткую демонстрацию .

Ответ №2:

в вашем первом файле:

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

myApp.config(function(myServiceProvider) {
....etc.
  

и в вашем втором файле:

 myApp.provider('myService', function () {
...etc.
  

Переменная MyApp является глобальной переменной, и вы можете получить к ней доступ везде на своем веб-сайте.
Вы можете взглянуть на Yeoman project, это генератор, который создает структуру вашего приложения angularjs и добавляет множество интересных функций.

Комментарии:

1. это просто другой синтаксис для добавления поставщика в приложение, но это не решает мою проблему