Очень удобно в bemhtml делается mix элемента на дочернем блоке:
block('block').elem('logo').def()(function(){
return applyCtx(
this.extend(this.ctx.content, {
mix: { block: this.ctx.block, elem: this.ctx.elem, mods: this.ctx.mods }
})
);
})
Подумалось, что неплохо бы видеть шорткат для такой конструкции в базовых шаблонах или шаблонах проекта. Кто-нидудь уже делал подобный шорткат для bemtree / bemhtml?
@Guria Так ведь можно же просто
{ mix: this.ctx }
PS: приведенный сниппет не будет работать для произвольного BEMJSON (например, если в
content
лежит массив или строка).Вот так и знал, что сморозил что-то. Спасибо. PS не актуален, но учту.
Блин, не работает магия всё таки. Ни моя, ни
{ mix: this.ctx }
. Оказалось, что вthis.ctx
у меня объект без поляblock
:Поэтому mix не отрабатывает как я ожидал. Я думал, что в контексте будет имя блока, раз на него матчится, а там только входной bemjson, как я понимаю.
Я конечно исправлю bemtree шаблон и вместо:
напишу
Однако я думал, что знание о текущем блоке элемента можно получить без этого.
@Guria
this.ctx
— это буквально то, что было передано в контекст без изменений, а достроенная сущность лежит вthis
(например, имя блока окажется вthis.block
).Я не адепт xjst, но было бы удобно иметь какой-то хелпер для получения
{ block, elem, mods }
. Может есть уже?Теперь понятнее, как раз хотел заглянуть что интересного в this лежит. Возвращаясь к начальному топику, можно ли делать
{ mix : this }
? потёр преждевременные комменты@Guria предложу на уровне проекта положить
i-bem.bemhtml
си в блоках использовать через
apply('self');
Хотя как на мой вкус, лучше написать чуть больше руками, но зато потомкам будет сильно проще разобраться в коде ;)
Я в первую очередь надеялся, что такой способ уже существует, а я просто его упустил. Согласен с замечанием про потомков. Однако при наличии такого шортката в базовых шаблонах и документации участь потомков будет уже не такой страшной. Но что-то мне подсказывает, что я знаю ответ.
@Guria кмк, это все-таки не такой частый кейс, чтобы добавлять в базовые шаблоны.
Я напротив считаю, что этот кейс актуален каждый раз при использовании блока на той же дом ноде, что и элемент.
Вот эта часть не работает, почему то. Во входном bemjson
{ elem: 'logo', mods: { some: 'val' } }
,this.block
иthis.elem
содержат корректные значения, а вthis.elemMods
иthis.mods
пусто.Посыпаю голову пеплом. модификаторы элемента ставятся с помощью elemMods в bemjson. Я, похоже, даже самого @tadatuta запутал. Правильный рабочий сниппет будет:
А вообще, конечно, было бы клёво видеть собранную сущность, например, в
this.entity
. А также до конца не ясно почему не работает{ mix : this }
.