EN
Kundin
Kundin
4 августа 2017

Допустим есть блок menu с элементами menu__item.
Как обернуть все menu__item в блок wrapper, используя bemhtml, чтобы не писать это в BEMJSON ручками.

Имеем:

    {
        block: 'menu',
        content: [
            { elem: 'item', content: 'item 1' },
            { elem: 'item', content: 'item 2' }
        ]
    }

Хотим:

    {
        block: 'menu',
        content: [
            {
                block: 'wrapper',
                content: [
                    {    block: 'menu', elem: 'item', content: 'item 1' },
                    { block: 'menu', elem: 'item', content: 'item 2' }
                ]
            }
        ]
    }

Такое возможно?

belozer
#belozer
8 августа 2017
// menu.bemhtml.js
block('menu')(
    content()((node, ctx) => [
        {
            block : 'wrapper',
            content : {
                html : applyCtx(ctx.content, { 
                    block : node.block
                })
            }
        }
    ])
);

правда не уверен, что это наиболее оптимальное решение

kompolom
#kompolom
8 августа 2017
block('menu')(
  content()((node, ctx) => {
     return {
        block : 'wrapper',
        content : applyNext()
    };
  })
)
belozer
#belozer
8 августа 2017

@kompolom это не сработает, т.к. элементы menu станут элементами блока wrapper, что не является ожидаемым поведением.

kompolom
#kompolom
8 августа 2017

Тогда можно, и я бы так сделал

block('menu')(
  content()((node, ctx) => {
     return {
        elem : 'wrapper',
        mix : { block : 'wrapper' },
        content : applyNext()
    };
  })
)
belozer
#belozer
8 августа 2017

@kompolom да, согласен.

Kundin
#Kundin
8 августа 2017

Спасибо, работает как нужно последний вариант.