Войти с помощью github
Форум /

Задача

У меня есть следующий bemhtml-шаблон на блок button:

{
    tag: 'button',
    content: (node, ctx) => ctx.icon ? [
        {
            elem: 'icon',
            url: ctx.icon
        },
        ctx.text ? {
            elem: 'text',
            content: ctx.text
        } : null
    ] : ctx.text || ctx.content
}

Здесь есть несколько вариантов генерации content. Также, есть блок form, у которого есть элемент send. Тело его шаблона выглядит следующим образом:

{
    tag: 'button',
    mix: {
        block: 'button',
        mods: {style: 'border', effect: 'invert'}
    }
}

По сути, мне нужно иметь возможность написать в bemjson что-то вроде этого:

{
    block: 'form',
    content: [
        {
            elem: 'send',
            icon: 'icon.svg',
            text: 'Submit'
        }
    ]
}

И я ожидаю результат:

<form class="form">
    <button class="form__send button button_style_border button_effect_invert">
        <svg class="button__icon" src="icon.svg"></svg>
        <span class="button__text">Submit</span>
    </button>
</form>

Что не является решением

Т.к. предикат на блок не срабатывает, находясь внутри микса, то никакой content не будет сгенерирован на основе icon и text. Предположим, я мог бы написать что-то вроде этого:

{
    block: 'form',
    content: [
        {
            block: 'button',
            mods: {style: 'border', effect: 'invert'},
            mix: {
                block: 'form',
                elem: 'send'
            },
            icon: 'icon.svg',
            text: 'Submit'
        }
    ]
}

Однако, реализация элемента form__send может изменится, и там могут быть совершенно другие модификаторы для button. Мне придется менять это везде в bemjson. По той же причине я не могу скопипастить реализацию content для button в form__send: реализация блока button может измениться.

В итоге

В идеале, мне нужно как-то задействовать поведение и button, и form__send в form__send. Т.к. через миксы это дело не работает, то я не знаю, что делать.

Да и вообще, поддержку шаблонов для миксов уже который год никак не могут выкатить. Как там в Яндексе без этого живут?