-
Notifications
You must be signed in to change notification settings - Fork 32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
mix works inconsistently #86
Comments
polite ping |
It's not about consistency, it's because of ambiguity and conflicts.
What result it should return? |
//cc @veged |
I think it should work as simple as CSS, last matcher should have more priority, then previous ones. |
Лень по-буржуйски писать ;) |
аналогичная проблема с исполнением миксов есть и в bemhtml — с теоретической точки зрения там всё решаемо, можно договориться про приоритеты и переопределения, так чтобы content перезатирал, а атрибуты миксовались — это будет покрывать все реальные кейсы использования |
@veged Это будет настолько обратно несовместимое изменение, что его никто не будет у себя внедрять. Это ж не только горы кода перелопатить, но и сознание поменять придется. Сейчас mix хорош тем, что для него не исполняются шаблоны, ты просто в удобном bemjson-формате описываешь, какие классы и параметры добавить на текущую ноду. А если начать делать шаблонизацию миксов, мозг начнёт плавиться, все будут ляпать ctx.cls(). Кроме того, может заметно упать скорость шаблонизации. Прямо сейчас в любом месте можно явно сделать processBemJson на нужный микс и сделать extend. Не вижу смысла и необходимости делать это везде. UPD: возможно, имело бы добавить какое-то новое API типа deepMix или extend, специально для таких штук. |
//cc @dfilatov @denchistyakov ? |
про поломки не очень согласен — сейчас шаблоны в основном пишутся так, что у штук, которые подразумеваютя к миксованию нет ничего особо своего (т.к. это всё равно не будет щас работать) про плавится мозг тоже странно — сейчас же с точки зрения CSS миксы себя ведут именно так, всё смешивается и ни у кого мозг не плавится по хорошему, миксы это также как модификаторы — в CSS это уже сейчас так, а в шаблонах модификаторы и миксы ведут себя по разному скорость да — это то, почему я написал "с теоретической точки зрения там всё решаемо", т.к. на практике есть ещё допрасходы случаев, когда нужно хотеть миксовать блоки без применения шаблонов я не могу представить (разве что то, что сейчас как-то так работает и люди привыкли) |
Отвечу по порядку.
|
Или вот еще пример: |
в целом я не горю желанием делать это — именно поэтому я только давно обдумываю, но ещё не реализовал — но, если наберётся некая критическая масса, то хорошо бы сделать |
я согласен с частью про плохую обратную совместимость. |
расскажите про это подробнее |
тоже об этом подумал на след, день после того, как увидел сообшение о том, что изначальная идея может всё сломать |
Вообще, странно осозновать, что теги и прочее не миксуется. Т.е. получается, что у меня уже сломанное сознание. Насколько я понимаю, то текущий В общем, нужны спеки, сделать — вопрос техники. |
Проблема в том, что не всё можно миксовать. Например, классы, можно. А вот теги — уже нет. Придется выбирать один тег из нескольких, возникает проблема выбора: какой тег важнее, тег базового блока или тег миксуемого? |
@mishanga какая же это проблема, если матчеры выполняются не параллельно, а подряд? соотв., логика та же самая, что как и везде: если стоит и без форса — пропускаем, если с форсом или не выставлен — ставим. А вот контент миксовать — это интересно. Надо ли его миксовать? Лишь бы не получилось так, что из-за непоняток с контентом мы теряли бы возможность миксовать все остальное. |
На мой взгляд, вот так:
Приоритет одиночных параметров, типа тегов, у Явная передача тега в миксах вообще не должна работать, а у базового блока имеет наивысший приоритет. Как всегда. Переопределение тега с форсом — ломает приоритеты, и переопределяет тег всегда, потому что не учитывается проставлен ли параметр с форсом или обычным образом — но так везде работает и хочется верить, что используется этот флаг не часто. Для контента сложнее, потому что там будут дополнительные проходы. Опять же, если возвращать контент из матчера с return — тоже отдельная песня. Оно же приостанавливает работу матчеров, так? |
return не приостанавливает работу матчеров; return вставляет новый узел в дерево на место старого и заново запускает все матчеры над ним. |
@mishanga простите за косноязычность и смуту. все верно. content можно либо склеивать, либо по аналогии с остальными полями. Если склеивать — то в обычном порядке. Но реальных use-кейсов я для этого не знаю, но не потому, что их нет, а потому, что не сталкивался. Хочу только добавить, что не так давно решалась задача с declMix для i-bem. И задача та по смыслу очень похожа на эту. bem/bem-bl#255 |
mix
mix classes and nottags
,attrs
and othermixes
and it's a consistency problem.tags
I want to use
link
block as mixin and not to hack it every time, so I want to write this way, but it's not working:So I have to write this ugly code:
attrs
Then, I want to use one block for analytics tracking, and it have
onclick
attrs and goal option. I want to mix it and expect to seeonclick
attr on parent block like this way:i-track.bh.js:
and use it like this:
But it's not working too.
other mixes
I want to use custom font on my site. So I have one block
i-face
with mods for each custom font, but in reality only one font is being used in project, so it's reasonable to create shortcut blocktextbook
, which have it's own mix with concretetextbook
font.In other words, I don't want to write
mix: [{ block: 'i-font', mods: { face: 'textbook' }}]
every time, because it's hard to remember and want to short it to this:mix: [{ block: 'textbook' }]
, where textbook block have suchbh
file:And finally it's not working at all.
The text was updated successfully, but these errors were encountered: