bem-site / bem-forum-content-ru

Content BEM forum for Russian speak users
MIT License
56 stars 6 forks source link

Шорткат для xjst: { block: this.ctx.block, elem: this.ctx.elem, mods: this.ctx.mods } #312

Open Guria opened 9 years ago

Guria commented 9 years ago

Очень удобно в 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?

tadatuta commented 9 years ago

@Guria Так ведь можно же просто { mix: this.ctx }

PS: приведенный сниппет не будет работать для произвольного BEMJSON (например, если в content лежит массив или строка).

Guria commented 9 years ago

Вот так и знал, что сморозил что-то. Спасибо. PS не актуален, но учту.

Guria commented 9 years ago

Блин, не работает магия всё таки. Ни моя, ни { mix: this.ctx }. Оказалось, что в this.ctx у меня объект без поля block:

{
  "elem" : "logo",
  "content" : {
    "block" : "kg-logo",
    "project" : "platform-ui",
    "mods" : {}
  }
}

Поэтому mix не отрабатывает как я ожидал. Я думал, что в контексте будет имя блока, раз на него матчится, а там только входной bemjson, как я понимаю.

Guria commented 9 years ago

Я конечно исправлю bemtree шаблон и вместо:

content: [
   { 
     elem: 'logo',
     content: this.ctx.logo
   },
]

напишу

content: [
   { 
     block: this.ctx.block,
     elem: 'logo',
     content: this.ctx.logo
   },
]

Однако я думал, что знание о текущем блоке элемента можно получить без этого.

tadatuta commented 9 years ago

@Guria this.ctx — это буквально то, что было передано в контекст без изменений, а достроенная сущность лежит в this (например, имя блока окажется в this.block).

qfox commented 9 years ago

Я не адепт xjst, но было бы удобно иметь какой-то хелпер для получения { block, elem, mods }. Может есть уже?

Guria commented 9 years ago

Теперь понятнее, как раз хотел заглянуть что интересного в this лежит. Возвращаясь к начальному топику, можно ли делать { mix : this }? потёр преждевременные комменты

tadatuta commented 9 years ago

@Guria предложу на уровне проекта положить i-bem.bemhtml с

mode('self')(function() {
    return {
        block: this.block,
        elem: this.elem,
        mods: this.elem ? this.elemMods : this.mods
    };
});

и в блоках использовать через apply('self');

Хотя как на мой вкус, лучше написать чуть больше руками, но зато потомкам будет сильно проще разобраться в коде ;)

Guria commented 9 years ago

Я в первую очередь надеялся, что такой способ уже существует, а я просто его упустил. Согласен с замечанием про потомков. Однако при наличии такого шортката в базовых шаблонах и документации участь потомков будет уже не такой страшной. Но что-то мне подсказывает, что я знаю ответ.

tadatuta commented 9 years ago

@Guria кмк, это все-таки не такой частый кейс, чтобы добавлять в базовые шаблоны.

Guria commented 9 years ago

Я напротив считаю, что этот кейс актуален каждый раз при использовании блока на той же дом ноде, что и элемент.

Guria commented 9 years ago

mods: this.elem ? this.elemMods : this.mods

Вот эта часть не работает, почему то. Во входном bemjson { elem: 'logo', mods: { some: 'val' } }, this.block и this.elem содержат корректные значения, а в this.elemMods и this.mods пусто.

Guria commented 9 years ago

Посыпаю голову пеплом. модификаторы элемента ставятся с помощью elemMods в bemjson. Я, похоже, даже самого @tadatuta запутал. Правильный рабочий сниппет будет:

mode('self')(function() {
    return {
        block: this.block,
        elem: this.elem,
        mods: this.mods,
        elemMods: this.elemMods
    };
});

А вообще, конечно, было бы клёво видеть собранную сущность, например, в this.entity. А также до конца не ясно почему не работает { mix : this }.