Структура блока
Блок с JavaScript функциональностью
Окружение
Для того, чтобы начать писать JavaScript, нужно подключить к странице блок
i-bem
, его элемент dom
и все их зависимости. Это произойдет автоматически,
если полностью повторить в своём проекте структуру из репозитория
project-stub.
HTML структура
JavaScript можно написать для любого БЭМ блока. Для этого сначала нужно поместить JavaScript файл в директорию блока.
desktop.blocks/ my-block/ my-block.js
Затем в BEMJSON описании страницы нужно пометить блок флагом js
.
{
block: 'my-block',
js: true
}
Это даст (после сборки и отработки BEMHTML шаблонов на JSON) DOM узел,
помеченный дополнительным классом i-bem
и атрибутом data-bem
с параметрами
блока.
<div class="my-block i-bem" data-bem="{'my-block':{}}">
...
</div>
Если вы не используете BEMJSON/BEMHTML, научите свои шаблоны производить такие блоки, или просто напишите этот HTML вручную.
Атрибут data-bem
нужен для хранения параметров блока в JSON. Структура
используется следующая:
{
"my-block" : {
"paramName": "paramValue"
}
}
Простой пример с console.log
pure.bundles/ 001-simple-block/ blocks/ my-block/ my-block.js 001-simple-block.bemjson.js 001-simple-block.html
Первый пример — самый простой. Он показывает структуру блока и работающий JavaScript.
Загрузите пример
001-simple-block в браузере с открытой консолью, и вы увидите вывод строки,
соответствующей outerHTML
блока.
BEMJSON декларация этого примера
001-simple-block.bemjson.js описывает простую страницу с
одним-единственным блоком my-block
.
Компонент my-block
расположен на уровне переопределения
001-simple-block/blocks и содержит JavaScript файл. Это файл
my-block.js, в нём довольно простой код.
modules.define('my-block', ['i-bem__dom'], function(provide, BEMDOM) {
provide(BEMDOM.decl(this.name, {
onSetMod: {
'js' : {
'inited' : function() {
console.log(this.domElem[0].outerHTML);
}
}
}
}));
});
Фреймворк i-bem использует модульную систему ymaps/modules.
Поэтому первой строчкой указывается, какой модуль использует компонент. В данном
случае это модуль
i-bem__dom
,
реализованный как элемент dom
блока i-bem
библиотеки
bem-core.
Далее внутри вы можете использовать объект BEMDOM
и его метод decl
для описания
вашего блока.
Первый параметр — имя блока.
Второй — хэш динамических свойств блока. Каждый экземпляр блока получает их копии.
Свойства могут быть какие угодно, но есть несколько специально
зарезервированных. Одно из них — onSetMod
, его можно увидеть в следующем примере.
Оно используется для хранения функций callback, которые нужно позвать, если блоку
назначается соответствующий модификатор.
BEMDOM.decl(this.name, {
onSetMod: {
'foo' : function() {
// Вызывается, если блоку назначается любое значение модификатора 'foo'.
// Работает и для 'булевых' модификаторов
},
'bar' : {
'qux' : function() {
// Вызывается, если блок приобретает модификатор
// 'bar' со значением 'qux'
},
'' : function() {
// Вызывается, если модификатор 'bar' удаляется с блока
},
'*' : function() {
// Запускается при назначению блока любого значения модификатора bar
}
},
'*' : function() {
// Запускается при назначении блоку любого модификатора
}
}
});
В эти функции callback приходят следующие параметры:
function(modName, modVal, currentModVal) {
// modName
// Имя модификатора
// modVal
// Значение для устанавливаемого модификатора.
// Это `String`, или `true`/`false` в случае булевых модификаторов.
// currentModVal
// Текущее значение модификатора
}
Первый модификатор, устанавливаемый на блок — это модификатор js
со значением
inited
.
Ядро фреймворка ищет на странице все блоки, промаркированные дополнительным
классом i-bem
, инициализирует их и назначает каждому модификатор js_inited
.
Таким образом, вы можете написать код, который запустится в самом начале работы
блока. Такой код нужно поместить в callback, соответствующий установке
модификатора js_inited
.
В предыдущем примере это был код, выводящий в консоль outerHTML
блока.