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",