EN
lilliputten
lilliputten
17 июля 2017

Необходимо назначить модификатор блоку 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') до рендеринга?

tadatuta
#tadatuta
17 июля 2017

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

lilliputten
#lilliputten
18 июля 2017

@tadatuta Да, спасибо. Способ тоже не оч. красивый, но по сравнению с тем трешем, что пришлось устраивать -- вершина элегантности. Переделал, стало гораздо чище. Выдохнул.

(Из-за крайне частых конструкций типа block('b').elem('e') иногда начинает казаться, что предикаты таки всё же иногда изображают вложенность.%)))