qmax
@qmax
программер

Как бы в angular сделать inversion of dependency injection?

Имеется офигенный код: plnkr.co/edit/lnijKg?p=info убеждающий меня, что неделя прожита не зря.
Но в этом коде есть одно не очень красивое место:
angular.module('main', ['ui.router', 'foo'])
    .config(function($stateProvider){
        $stateProvider
            .state('foo', { url: "/foo", 'abstract': true })
            .state('foo.bar', { url: "/bar", directive: 'foo-bar' })
            .state('foo.baz', { url: "/baz/:id", directive: 'foo-baz', closable: true })
        ;
    })

И это практически единственное место, где модуль main пересекается с foo. Однако, в реальном приложении таких foo будет 7. Я, конечно, не умру написать 21 важных строчек, но как-то не комильфо.

0. В принципе, можно сократить эти строчки на порядок, засунув конфиги сотояний внутрь модулей в виде констант:
angular.module('main', ['ui.router', 'foo', 'bar','baz'])
.config(function($stateProvider, fooStateConfs, barStateConfs, bazStateConfs){
  function setup_states(modname, stateconfigs) {
    $stateProvider.state(modname, { url: "/"+modname, abstract: true});
    anguar.forEach(stateconfigs, function(name, params) { $stateProvider.state(modname+'.'+name, params }); });
  }
  setup_states('foo', 'fooStateConfigs');
  setup_states('bar', 'barStateConfigs');
  setup_states('baz', 'bazStateConfigs');
})


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

1. плоскомозгое решение
генерить на сервере модуль metaconf с описанием какие модули enabled.
if( metaConf.enabled_mods.foo )  setup_states('foo', 'fooStateConfigs');
if( metaConf.enabled_mods.bar )  setup_states('bar', 'barStateConfigs');


2. мне кажется, angularное решение, должно выглядеть как-то так:
angular.module('foo',['main'])
.config(function(mainTabsProvider) {  
  mainTabsProvider.tabs('foo');
  mainTabsProvider.tab('foo.bar', params);
  mainTabsProvider.tab('foo.baz', params);
});

angular.module('main',[])
.provider('mainTabs', function() { ... })


Тоесть, каждый модуль сам регистрирует все свои состояния.
Конфигурирование наличия модулей решается просто включением/отключением строчки script в на стартовой странице. Красота же!

Но если у main нет зависимости от foo/bar/baz - эти модули вообще не будут инициализироваться, если их не воткнуть куданить в html ng-app="foo".

Как быть?

Кажется, пахнет чем-то типа future states из ui-router-extra.
Но я его пока боюсь.
  • Вопрос задан
  • 2455 просмотров
Пригласить эксперта
Ответы на вопрос 1
TekVanDo
@TekVanDo
Javascript Developer
я думаю нужно смотреть в сторону https://github.com/ocombe/ocLazyLoad
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы