Angularjs — как исправить службу инжекта из другого модуля, который не зависит?

Я не понял, как работают модульные зависимости.

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

Модуль «Приложение» включает в себя «модуль1» и «модуль2». «module2» включает «основной» модуль. На плункере есть исходный код.

angular.module("core", []).factory("HelloWorld", function() {
  return function () {
    alert('Hello World!')
  }
});

angular.module("module1", []).controller("main", function(HelloWorld){
  HelloWorld();
});

angular.module("module2", ["core"]);

angular.module("app", ["module1", "module2"]);

Если я ввожу сервис из ядра модуля в модуль «module1», он работает нормально. Но «основной» модуль не зависит от модуля «module1». Почему это происходит?


person iKBAHT    schedule 30.06.2014    source источник


Ответы (1)


Поскольку ваш модуль приложения зависит от основного модуля (косвенно через модуль 2), службы в основном модуле доступны в любом месте внутри вашего модуля приложения (включая модуль 1).

Это связано с тем, что Angular сначала загрузит все модули, а затем начнет создавать их компоненты и разрешать внедренные зависимости.

Тем не менее, если вам действительно нужны основные службы в модуле 1, вы также должны сделать их зависимыми от основного модуля. Таким образом, ваше приложение не сломается, если модуль 2 будет изменен позднее (или вообще удален), а ваш модуль 1 будет более автономным и пригодным для повторного использования (например, вы можете использовать его с другим приложением, которое не зависит от Основной модуль).

В общем, не стоит полагаться на «косвенные» зависимости. Каждый модуль должен явно объявлять свои зависимости.
Angular достаточно умен, чтобы загружать модуль, только если он еще не загружен, поэтому нет накладных расходов.

Цитата из раздела о модулях Руководства для разработчиков:

Модули могут перечислять другие модули как их зависимости. В зависимости от модуля подразумевается, что требуемый модуль должен быть загружен до загрузки требуемого модуля. Другими словами, блоки конфигурации требуемых модулей выполняются раньше блоков конфигурации требуемого модуля. То же самое относится и к беговым блокам. Каждый модуль можно загрузить только один раз, даже если этого требуют несколько других модулей.

(выделено мной)

person gkalpak    schedule 30.06.2014
comment
Это искусственный пример. Логически я ожидал увидеть ошибку, потому что между core и module1 нет явной связи. Спасибо - person iKBAHT; 30.06.2014
comment
@iKBAHT: Добро пожаловать! (Если это отвечает на вопрос, отметьте его как принятый и/или проголосуйте за него :)) - person gkalpak; 02.07.2014
comment
@ExpertSystem Я хотел бы увидеть любую ссылку на документацию по этой функции. - person iKBAHT; 04.07.2014
comment
@iKBAHT: я могу опубликовать ссылку на свой ответ: D О какой функции вы говорите? - person gkalpak; 04.07.2014
comment
@iKBAHT: Вы видели ссылку на документацию? - person gkalpak; 12.07.2014