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