Необходимо назначить модификатор блоку menu
, вложенному select
(нужен код на экземпляре блока, связанный с модификатором). Пробую так:
block('select').mod('nicescroll', true)(
block('menu')(
addMods()(function(){
return {
nicescroll : true,
};
})
),
// ...
Эффект нулевой.
Как?????????????
UPD: Ага. В bem-components так:
block('select').elem('menu')(
replace()(function() {
// ...
Т.е., наверное, могу ловить elem('menu')
как-то. Щас попробую.
UPD-UPD: Ничего не придумал, кроме:
block('select').mod('nicescroll', true).elem('menu').replace()(function(){
var ctx = applyNext();
ctx = ctx.replace(/\b(class="menu)\b/, '$1 menu_nicescroll');
return ctx;
}),
Но ведь это же неправильно!!!
Нет возможности перехватывать определение block('select').mod('nicescroll', true).block('menu')
до рендеринга?
BEMHTML не поддерживает «вложенные» селекторы.
Селекторы в BEMHTML работают точно так же, как множественные селекторы в CSS. А скобки — это такой же «синтаксический сахар», как нестинг в CSS-препроцессорах.
Т.е.
block('select').mod('nicescroll', true)(block('menu'))
— это то же самое, чтоblock('select').mod('nicescroll', true).block('menu')
и по сути является полным аналогом.select.select_nicescroll.menu
(а не.select.select_nicescroll. menu
).Пример того, как решить исходную задачу, разбирали здесь: https://ru.bem.info/forum/1371/#comment-311956446
@tadatuta Да, спасибо. Способ тоже не оч. красивый, но по сравнению с тем трешем, что пришлось устраивать -- вершина элегантности. Переделал, стало гораздо чище. Выдохнул.
(Из-за крайне частых конструкций типа
block('b').elem('e')
иногда начинает казаться, что предикаты таки всё же иногда изображают вложенность.%)))