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

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

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

Модуль "Приложение" включает в себя "module1" и "module2". "module2" включает в себя модуль "core". Есть источник на поршне.

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". Почему это происходит?

1 ответ

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

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

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

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

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

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

(акцент мой)

Другие вопросы по тегам