Доступ к константам из супермодуля во включенных модулях (config())

У меня есть глобальный модуль «приложение», который включает два других модуля «app.core» и «app.service». Это базовые настройки. Внутри двух подмодулей я могу получить доступ к константе из обоих двух модулей. Однако я не могу получить доступ к константам, объявленным в «приложении», в «app.core» или «app.service».

Также я использую angular.bootstrap для задержки инициализации, потому что мне нужно получить конфигурацию с сервера. Но после получения конфигурации я делаю angular.module('app').constant('config', config); Таким образом, константа должна быть четко определена.

ПОСЛЕДНИЙ момент, внутри конфигурации модуля «приложение» я могу получить доступ к константе конфигурации.

Есть идеи ?

Объявление констант модуля 'app'

angular.module('app',[
    'app.core',
    'app.service'
])
    .module('app')
    .constant('foo', 'foo')

константы app.core

    angular
    .module('app.core')
    .constant('core', 'core');

В app.service я могу получить основную константу

    angular.module('app.services',[]).config(function($injector){
        console.log($injector.get('core'));
    })

Но я не могу получить константу «приложение»

angular.module('app.services',[]).config(function($injector){
        console.log($injector.get('foo'));
    })

Будет крах


person max54    schedule 02.02.2015    source источник
comment
angular.module('app.services',[]).config(function($injector, 'foo'){ console.log($injector.get('foo')); }), возможно?   -  person camden_kid    schedule 02.02.2015
comment
Если я не ошибаюсь, $injector - это способ доступа к компонентам, внедряемым напрямую, вместо того, чтобы объявлять их внутри объявления функции. Так что это то же самое и не работает, к сожалению. Кстати, я не понял, что вы на самом деле имеете в виду, вы пишете строку внутри объявления функции?   -  person max54    schedule 02.02.2015
comment
Извините, это должно было быть без одинарных кавычек. Я думаю, что ответ Скарлза находится на правильном пути.   -  person camden_kid    schedule 03.02.2015


Ответы (1)


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

Причина, по которой core доступна для app.services, несмотря на это, заключается в том, что вы перечислили зависимости в таком порядке при определении app, что angular загрузил app.core до app.services. Однако порядок определенных зависимостей не должен иметь значения.

Чтобы исправить это, вам следует подумать о рефакторинге ваших модулей, чтобы не было внутренней циклической зависимости. Например, рассмотрите возможность сделать вашу конфигурацию отдельным модулем и внедрить ее в зависимые службы:

angular.module('app', ['app.core', 'app.services'])

angular.module('app.config', [])
  .constant('foo', 'foo')

angular.module('app.core', ['app.config'])
  .config(function(foo) {})

angular.module('app.services', ['app.config'])
  .config(function(foo) {})

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

person scarlz    schedule 02.02.2015
comment
Большое спасибо, это работает хорошо, если я использую другой модуль для конфигурации. Однако у меня есть еще один вопрос, теперь мне интересно, почему app.service может получить доступ к константе app.Core и наоборот? Я имею в виду, что они не включают друг друга, верно? - person max54; 03.02.2015
comment
Именно это подразумевает мой второй абзац — константа app.core доступна благодаря тому, что она уже была загружена как первая зависимость app. Это можно продемонстрировать, поменяв порядок зависимостей на app, так как тогда вы увидите ошибку. - person scarlz; 03.02.2015
comment
Да, я запутался в этом вопросе, но благодаря вам теперь все ясно ;). - person max54; 03.02.2015