bem / bem-xjst

bem-xjst (eXtensible JavaScript Templates): declarative template engine for the browser and server
https://bem.github.io/bem-xjst
Other
115 stars 47 forks source link

Очередность применения шаблонов для элемента при указании `block('*').elem('*')` #508

Closed vill closed 6 years ago

vill commented 6 years ago

Всем привет. Почему если в списке шаблонов для элемента есть шаблон с указанием имени сущности block('*').elem('*') он или не применяет свой режим или блокирует дальнейший поиск подходящих wildcard шаблонов?

Input code or something about issue background

([
    { block: 'block', elem: 'elem' }
]);
block('block').elem('*').cls()('class2');
block('*').elem('*').cls()('class1');
block('block').elem('elem').cls()('class3');

Expected Behavior

в зависимости что будет приоритетнее block('*').elem('*')

<div class="block__elem class1"></div>

или block('block').elem('*')

<div class="block__elem class2"></div>

Actual Behavior

<div class="block__elem class3"></div>

Possible Solution

если убрать шаблон для block('*').elem('*')

block('block').elem('*').cls()('class2');
// block('*').elem('*').cls()('class1');
block('block').elem('elem').cls()('class3');

работает правильно

<div class="block__elem class2"></div>

Your Environment

[Ссылка на пример](https://bem.github.io/bem-xjst/?version=8.5.2&engine=BEMHTML&template=%0A%0A%0Ablock(%27block%27).elem(%27*%27).cls()(%27class2%27)%3B%0Ablock(%27*%27).elem(%27*%27).cls()(%27class1%27)%3B%0Ablock(%27block%27).elem(%27elem%27).cls()(%27class3%27)%3B&bemjson=(%5B%0A%20%20%20%20%7B%20block%3A%20%27block%27%2C%20elem%3A%20%27elem%27%20%7D%0A%5D)%3B%0A)

miripiruni commented 6 years ago

В документации написано

Шаблон с подпредикатом на * будет приоритетнее, чем шаблон с конкретным именем в подпредикате.

https://github.com/bem/bem-xjst/blob/master/docs/ru/7-runtime.md#Шаблоны-на-любые-сущности

У нас есть бородатый баг про то, как себя ведет block('*') и block('*').elem('*'). Первый применится ко всему (и элементам без блоков и пустым объектам). А второй не применится ни к чему кроме пустых объектов. Это исправлено, но не выпущено, так как это мажорные изменения (хоть и исправление бага, но этим багом уже пользуются как есть). Могу добавить в этот PR твой пример в качестве тесткейса.

vill commented 6 years ago

Про шаблон с подпредикатом на я знаю, в описании я имел ввиду #256 поэтому и написал или class1 или class2 что будет приоритетнее с этим багом я не знаю, а вопрос был почему он вообще выводит class3 если за `block('').elem('').cls()('class1');идетblock('block').elem('').cls()('class2');` а он не применяется?

block('block').elem('*').cls()('class2'); // Если пред. шаблон не применяется почему до этого не доходит очередь?
block('*').elem('*').cls()('class1');     // Если этот шаблон применяется почему тогда на выходе class3?
block('block').elem('elem').cls()('class3');
miripiruni commented 6 years ago

@vill это баги.

1) Подпредикат block('*').elem('*') сейчас глючит и сам ни на что не матчится.

2) Подпредикат block('block').elem('*') считает что ему необходимо найти элемент с именем * и соответсвенно не применяется (не на что).

Я оба этих случая исправлю и добавлю тесткейсами в https://github.com/bem/bem-xjst/pull/455.

vill commented 6 years ago

Хорошо, понял.