Правильно ли я понимаю, что нельзя сматчиться на элемент блока, который примиксован к другому блоку?
// bemjson
({
block: 'start-screen',
content: [
{
block: 'button',
mix: {block: 'start-screen', elem: 'button'}
},
]
});
// bemhtml
block('start-screen')(
elem('button').tag()('p')
);
Выдает такой html
<div class="start-screen">
<div class="button start-screen__button"></div>
</div>
То есть правило в bemhtml не заматчилось. Ссылка на песочницу https://bem.github.io/bem-xjst/?bemhtml=block(%27start-screen%27)(%0D%0A%20%20%20%20elem(%27button%27).tag()(%27p%27)%0D%0A)%3B&bemjson=(%7B%0A%20%20%20%20block%3A%20%27start-screen%27%2C%0A%20%20%20%20content%3A%20%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20block%3A%20%27button%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mix%3A%20%7Bblock%3A%20%27start-screen%27%2C%20elem%3A%20%27button%27%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%5D%0A%7D)%3B%0A
Мне это нужно, чтобы обернуть блок button в обертку для выравнивания кнопки по центру. И выравнить мне ее нужно только внутри блока start-screen, то есть, где есть класс start-screen__button.
Общий ответ — нет, шаблоны на миксы не применяются, т.к. возникают неоднозначные моменты: если у основного блока и у миксов заданы теги, какой генерить в итоге? Если и там и там есть атрибуты, их объединять или перекрывать? И так далее.
Когда-нибудь, возможно, мы договоримся про однозначные правила приоритетов и запилим поддержку, но это точно не в ближайшее время случится.
Ответ про твой кейс: я бы вместо микса просто завернул кнопку в нужный элемент на этапе генерации BEMJSON. А если все-таки хочется делать это на стороне BEMHTML, то можно сделать так (взводить ли флаг в this — на твое усмотрение, проверки на модификатор теоретически и так должно быть достаточно):
https://bem.github.io/bem-xjst/?bemhtml=block(%27start-screen%27).def()(function()%20%7B%0D%0A%20%20%20%20return%20applyNext(%7B%20_inStartScreen%3A%20true%20%7D)%3B%0D%0A%7D)%3B%0D%0A%0D%0Ablock(%27button%27).match(function()%20%7B%0D%0A%20%20%20%20return%20this._inStartScreen%20%26%26%20%5B%5D.concat(this.ctx.mix)%0D%0A%20%20%20%20%20%20%20%20.some(function(item)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20item.block%20%3D%3D%3D%20%27start-screen%27%20%26%26%20item.elem%20%3D%3D%3D%20%27button%27%3B%0D%0A%20%20%20%20%20%20%20%20%7D)%3B%0D%0A%7D).tag()(%27p%27)%3B&bemjson=(%7B%0A%20%20%20%20block%3A%20%27start-screen%27%2C%0A%20%20%20%20content%3A%20%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20block%3A%20%27button%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mix%3A%20%7Bblock%3A%20%27start-screen%27%2C%20elem%3A%20%27button%27%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%5D%0A%7D)%3B%0A
Спасибо, получилось) Ссылка на окончательный вариант с оберткой, может кому-нибудь пригодится.