Имеется офигенный код:
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.
Но я его пока боюсь.