В репозитории на базе project-stub с использованием bemtree, bemhtml и i-bem я собираю несколько универсальных компонентов на базе bem-components. Репозиторий с помощью bower подключается к проекту на angularjs (собираемого browserify). Задача которую надо решить: доступ к bemtree, bemhtml и i-bem внутри angular директив и прочих сервисах.
Для начала я не смог подружить собранный js файл с browserify (хотя не уделил этой проблеме должного внимания). Пока остановился на варианте подключать его между самим angular.js и собранным browserify бандлом. Буду благодарен если кто-то подскажет более красивое решение.
Модули из ymodules можно извлечь только асинхронно. Потому я пришёл к решению, что бутстрапинг angular приложения надо откладывать пока не будет определён некий промис. Я создал модуль, специально для этого случая предположив, что однажды захотим грузить асинхронно ещё что-нибудь:
angular.module('asyncModules', [])
.provider('modulesResolver', function modulesResolverProvider() {
var modules = [
// modules should be also defined in App dependencies
require('./kgBem.js').resolve
];
this.$get = function modulesResolverFactory($q) {
return $q.all(modules);
};
});
В kgBem.js я извлекаю модули из ymodules и размещаю их в angular. Экспортирую промис для вышеописанного модуля
var initInjector = angular.injector(['ng']);
var $q = initInjector.get('$q');
var deferred = $q.defer(),
resolve = deferred.promise;
// modules should be loaded by kg-bem-components dist.js before application js
modules.require(
['BEMTREE', 'BEMHTML', 'i-bem__dom', 'kg-appbar'],
function (BEMTREE, BEMHTML, BEMDOM) {
angular.module('kgbem', [])
.value('bemtree', BEMTREE)
.value('bemhtml', BEMHTML)
.value('bemdom', BEMDOM)
.directive('kgAppbar', kgAppbar);
function kgAppbar($compile, bemtree, bemhtml, bemdom, routehelper) {
// template for appbar
var appbar = {
block: 'kg-appbar',
attrs: {'ng-if': 'factory.currentUser'},
title: '{{factory.appbarTitle.getText()}}',
controls: [
//{ elem: 'bookmarks' },
{
elem: 'menu',
items: routehelper.menuItems['main'],
systemItems: routehelper.menuItems['system']
}
]
};
function linker(scope, element) {
bemtree.apply(appbar).then(function (bemjson) {
element.html(bemhtml.apply(bemjson));
bemdom.init(element);
$compile(element)(scope);
});
}
return {
link: linker
}
}
deferred.resolve();
});
module.exports.resolve = resolve
Ну и при бутстрапинге ожидаю разрешения промисов модуля asyncModules.
var initInjector = angular.injector(['ng', 'asyncModules']);
initInjector.get('modulesResolver')
.then(function(){
angular.bootstrap(document, ['factoryApp']);
});
Вопрос по сути тот же. Насколько это правильно и есть ли более прямые пути?
@Guria не могу похвастаться глубоким знанием Ангуляра, но вроде вполне годное решение