Стандартная инициализация блока i-bem
понятна, есть желание реализовать блок с авто инициализацией внутри, делаю так:
modules.define( 'myBlock', ['i-bem__dom', 'jquery', 'next-tick' ],
function ( provide, BEMDOM, $, nextTick ) {
BEMDOM.decl( this.name, {
onSetMod: {
js: {
inited: function () { }
}
}
} );
provide(BEMDOM);
$(function() {
nextTick(BEMDOM.init('myBlock'));
});
}
);
Это не работает, подскажите куда посмотреть.
Хочу для этого особенного блока использовать простую разметку, вместо:
<div class="myBlock i-bem" data-bem="{"myBlock": {}}">load...</div>
только так:
<div class="myBlock">load...</div>
TL;DR вместо
BEMDOM.init()
нужно$('.' + this.name).bem(this.name);
А если подробнее, то
modules.define()
создает класс, а дальше нужно на конкретном DOM-узле создать его экземпляр. Микс с классомi-bem
как раз подсказывает ядру, на каких узлах нужно инитить блоки.От микса с блоком
i-bem
можно отказаться, если использоватьBEMDOM.init($ctx)
, где$ctx
— это ссылка на DOM-элемент, а не просто строка. Но т.к. потенциально на одном узле могут быть смиксованы несколько блоков, не очевидно, какой из них нужно инициализировать — для этого и служитdata-bem='{ "block-name": {} }'
— ключи хеша являются именами блоков.Поэтому, если стоит задача отказаться и от
data-bem
, то нужно явно сказать, какой блок на каком узле инициализировать. Сделать это можно с помощьfind*
-методов из другого блока или вызовом методаbem()
на jQuery-цепочке:$('.' + this.name).bem(this.name);