Closed voischev closed 8 years ago
ping @tadatuta @vithar @veged
Историческая подоплека: если для некоторого блока написаны шаблоны для какого-то модификатора, то потенциально есть два варианта ожидаемого поведения:
Кроме того, иногда нужно знать, какие модификаторы были заданы в BEMJSON, а какие были добавлены в рантайме из шаблонов.
this.ctx.mods
— это значение модификаторов, изначально переданное в BEMJSON. Его изменение приводит лишь добавлению классов.
А изменение this.mods
приведет к применению шаблонов на вновь выставленные модификаторы.
С этим все понятно. Что делать с ссылками или добавлением нового объекта? Потому что поведение явно требует либо доработки или пояснения как с этим жить всем. Потому что даже с этой "исторической подоплекой" модификаторы работают по прежнему так же неожиданно. :)
Ну так со ссылками ты сам же и написал про причины.
Я бы предложил всегда использовать такой способ досыпания модификаторов в рантайме:
block('b1').def()(function() {
return applyNext({ mods: this.extend(this.mods, { m1: 'v1', m2: 'v2' }) });
});
А от всех прочих вариантов просто отказаться.
@tadatuta О! Спасибо! Годиться!
@tadatuta правда что-то в enb-bemxjst@next пакете такое не прокатило :-( Остается по ссылкам работать.
вообще, для случая, когда нужно просто добавить класс, я бы рекомендовал использовать mix
а не трогать ни this.mods
ни this.ctx.mods
(которые вообще-то должны ссылаться на один и тот же объект)
@veged для такого простого случая так и делаем ;)
Поиграться можно тут http://bem.github.io/bem-xjst/
Пара типов данных
или
Далее буду приводить по паре шаблонов где можно отсмотреть разное поведение при разных условиях и при этом ожидание результата не оправдывается
Вариант 1 (как бы правильный)
вариант 2
Вариант 3
Вариант 4! Причем работает как нужно есть есть
mods
в bemjsonЕще их вариации
Что интересно даже
Не работает как нужно. Ожидаю что как бы я не записал модификаторы (через создание нового объекта или через ссылку. через this.mods или через this.ctx.mods) то отработают шаблоны по ним и классы будут в результате шаблонизации.
Вероятно дело в том что когда в mods пишешь новый объект ссылки теряются по этому то шаблон BEMHTML не отрабатывает то класс не проставляется в результате шаблонизации. Не доконца ясна в таком случае ситуация с this.mods и this.ctx.mods
Как это объясняется вами? И что делать? Что будет делаться если будет?