Коллекции блоков и элементов
Общее описание Способы получения API
Для удобства работы одновременно с несколькими экземплярами блоков или элементов существует специальный класс коллекции, реализованный в элементах collection
блоков i-bem
и i-bem-dom
.
Способы получения коллекции
Создание экземпляра класса коллекции
Экземпляр класса коллекции создается базовыми средствами JavaScript,
с помощью класса BemCollection
модуля i-bem__collection
или BemDomCollection
модуля i-bem-dom__collection
.
Конструктор обоих классов принимает один аргумент в виде массива, либо несколько аргументов:
entities
{Array|...i-bem:Entity|...i-bem-dom:Entity}
— массив или несколько экземпляров БЭМ-сущностей.
Пример
modules.define(
'my-form',
['i-bem-dom', 'i-bem-dom__collection', 'button', 'input'],
function(provide, bemDom, BemDomCollection, Button, Input) {
provide(bemDom.declBlock(this.name, {
onSetMod : {
'js' : {
'inited' : function() {
var button = this.findChildBlock(Button),
input = this.findChildBlock(Input);
this._controls = new BemDomCollection(button, input);
}
}
}
}));
});
Методы поиска
Методы поиска, способные найти несколько экземпляров блоков или элементов, возвращают коллекцию, состоящую из найденных экземпляров.
Пример
modules.define('my-form', ['i-bem-dom', 'input'], function(provide, bemDom, Input) {
provide(bemDom.declBlock(this.name, {
onSetMod : {
'js' : {
'inited' : function() {
this._inputs = this.findChildBlocks(Input);
}
}
}
}));
});
Методы коллекции
setMod(modName, [modVal=true])
,delMod(modName)
,toggleMod(modName, modVal1, [modVal2], [condition])
— соответсвуют одноименным методам управления модификаторами экземпляра блока и элемента.everyHasMod(modName, [modVal])
,someHasMod(modName, [modVal])
— применяют методhasMod(modName, modVal)
для каждой сущности коллекции. Возвращаетtrue
, если все вызовы вернулиtrue
и если хотя бы один вызов вернулtrue
, соответственно.get(i)
— возвращает элемент коллекции по индексу i.size()
— возвращает размер коллекции.forEach(fn, ctx)
,map(fn, ctx)
,reduce(fn, ctx)
,reduceRight(fn, ctx)
,filter(fn, ctx)
,some(fn, ctx)
,every(fn, ctx)
,has(entity)
,find(fn, ctx)
,concat(...args)
— соответствует одноименным методам объекта Array.toArray()
— преобразовывает коллекцию в массив экземпляров блоков и элементов.
Пример
modules.define('my-form', ['i-bem-dom', 'input'], function(provide, bemDom, Input) {
provide(bemDom.declBlock(this.name, {
onSetMod : {
'js' : {
'inited' : function() {
this._inputs = this.findChildBlocks(Input);
}
},
'disabled' : function(modName, modVal) {
this._inputs.setMod(modName, modVal);
}
},
getValue : function() {
return this._inputs
.filter(function(input) {
return !input.hasMod('disabled');
})
.map(function(input) {
return input.getValue();
});
}
}));
});