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

UPD

По результатам вторых суток исследований ясно, что не происходит вызов decl.fn.apply в ymodules:startDeclResolving, т.е., до вызова provide(...) дело не доходит. Похоже, дело в том, что инициализируются те модули, что были определены до вызова jQuery.ready.

modules.define отрабатывает (кажется) нормально и описание модуля появляется в modulesStorage. Т.е., в этой части вроде всё ок.

Т.е., как сейчас представляется, нужна возможность сказать (кому? YM?), что добавлены модули и надо бы проверить зависимости.

На данный момент проблема решилась ручным вызовом modules.require(['test1'], ...) после загрузки кода модуля. Немножко странно, но работает. Видимо, если не найдётся более грамотного решения, буду лепить подпорку на основе этого хака. Увы.

Описание ситуации

Загружаю btmhtml-шаблоны и y-модуль с кодом класса блока динамически, примерно таким образом (упрощённо; специально вытащил в тапой отдельный код, чтоб проще отлавливать ошибки):

var src = '/static/js/bem-test/test.browser.js';
var script = document.createElement('script');
script.type = 'text/javascript';
script.charset = 'utf-8';
script.onload = function script_on_load () { console.info('test1 script loaded'); };
script.src = src;
var head = document.getElementsByTagName('head')[0];
head.appendChild(script);

Шаблоны подсасываются и работают нормально (с небольшим хаком в BEM-XJST User-code Start), а вот с модулями какая-то беда.

I-BEM почему-то думает, что этот блок должен быть live -- причём только при такой (динамической) загрузке; если цеплять линком (<script ... src="..."></script>), то всё срабатывает нормально.

После загрузки модуля блок создаётся примерно так:

var pageBemhtml = { block : 'test', content : 'test1' };
var pageHtml = BEMHTML.apply(pageBemhtml);
var pageDom = BEMDOM.update(app.elem('container'), pageHtml);

В порядке эксперимента пробовал после этого ещё насильно инициализировать блок (с помощью BEMDOM.init(...)), -- результат нулевой.

Было замечено, что в initBlock(...) не выполняется условие

if(!(blockClass._liveInitable = !!blockClass._processLive()) || forceLive || params.live === false) {

-- и класс блока (block = new blockClass(uniqIdToDomElems[uniqId], params, !!forceLive);) не создаётся.

В дебагере пробовал возвращать из _processLive() false, -- тогда проходит внутрь и вроде как создаёт blockClass, но с live та же засада. Пока не понял, куда смотреть, что ещё отваливается.

И главное -- совершенно не понятна причина отваливания.

Прошу подсказок и советов.

Исходники шаблонов и модуля (на всякий случай)

Код модуля (тут для примера всё максимально простое пока):

console.info( 'module test1 root code' );
modules.define('test1', [
        'i-bem__dom',
        'jquery',
    ],
    function ( provide,
        BEMDOM,
        $
    ) {
console.info( 'module test1 provide' );
provide(BEMDOM.decl('test1', {
    onSetMod : {
        'js' : {
            'inited' : function() {
                console.info( 'module test1 initalize' );
            }
        }
    },
}
));
});

И шаблон (bemhtml):

block('test1')(
    content()(function(){
        var ctx = this.ctx;
        return [
            '<h1>Test1</h1>',
            ctx.content,
        ];
    }),
    js()(function(){
        return { test : 'test1' };
    })
);

Версии бибилиотек:

"bem-core": "~2.9.1",
"bem-components": "~2.5.1",