Войти с помощью github
Форум /

В репозитории на базе 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']);
    });

Вопрос по сути тот же. Насколько это правильно и есть ли более прямые пути?