bem-site / bem-forum-content-ru

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

Модификаторы одного js блока на нескольких DOM-нодах #189

Open Guria opened 9 years ago

Guria commented 9 years ago

Выявил особенность работы с модификаторами одного js блока на нескольких DOM-нодах:

{ block: 'a', mods: { foo: 'bar'}, js( { id:1})},
{ block: 'a', js( { id:1})}
> this.hasMod('foo')
true
> this.toggleMod( 'foo', 'bar').getMod( 'foo')
""
{ block: 'a', js( { id:1})}
{ block: 'a', mods: { foo: 'bar'}, js( { id:1})},
> this.hasMod('foo')
false
> this.toggleMod( 'foo', 'bar').getMod( 'foo')
"bar"

Возможные последствия:

Способы решения:

#asktheteam

tadatuta commented 9 years ago

@dfilatov Дима, что думаешь?

Guria commented 9 years ago

Я не рассматривал варианты изменения поведения самих методов в i-bem, оставив этот вопрос на усмотрение команды bem-core

qfox commented 9 years ago

А мы точно никак не можем собирать все модификаторы со всех блоков дом-нод и синхронизировать их? Неприятная штука.

dfilatov commented 9 years ago

Нет, мы не должны хотеть синхронизировать модификаторы у блоков на нескольких дом-нодах. Представим себе ситуацию, когда один и тот же модификатор на разных нодах имеет разные значения. Какой должен оказаться итоговым? Сразу скажу, что завязываться на порядок этих элементов в DOM'е плохая идея. И это не единственная проблема.

Guria commented 9 years ago

@dfilatov так дело именно в том, что после запуска setMod / removeMod мод установится/уберется на всех дом нодах.

dfilatov commented 9 years ago

@Guria Я не понимаю, о чем именно это говорит

Guria commented 9 years ago

@dfilatov Перечитал ещё раз. Не увидел сразу, что речь о разных значениях. Предложения остаются прежними: документировать и предупреждать в дев режиме.

dfilatov commented 9 years ago

Про подумать про дебаг-режим есть таск: https://github.com/bem/bem-core/issues/836, можно дописывать свои предложения туда

qfox commented 9 years ago

@dfilatov В любом случае, что-то сделать нужно. Может быть дать возможность выставлять модификаторы не на инстанс блока, а на domElem?

В данный момент у нас при инициализации одно поведение, и после — другое. Т.е. либо setMod должен выставлять модификатор только у того же, у которого он проверяет модификатор. Либо hasMod должен проверять модификатор у всех.

Правильнее всего, либо синхронизировать их насильно, собирая все модификаторы, либо, при использовании механизма js: { id : Number }, как-то запрещать или срать варнингами в дебаг режиме, что это может сломаться, и нужно указывать явно дом-ноду, на которой нужен модификатор.

Но в случае со множественными дом-нодами и отдельными модификаторами на них есть еще одна проблема — в этом случае onSetMod должен принимать target, чтобы понимать, где именно он сменился, логика ломается.

Может быть стоит переосмыслить эти множественные дом ноды?

dfilatov commented 9 years ago

@zxqfox Модификатор — это неотъемлемая часть блока, не может блок быть в таком непонятном состоянии. И не надо js заставлять исправлять "косяки", пришедшие ему из верстки. Про дебаг-режим ответил выше.

qfox commented 9 years ago

@dfilatov Я и не предлагаю. Я говорю, что текущая логика неконсистентна и непредсказуема без знания деталей реализации. Это, естественно, зло.

Хотел бы понять, как с твоей точки зрения правильнее это решить: контролировать bemjson и хтмл-выдачу?

dfilatov commented 9 years ago

cc @veged

qfox commented 9 years ago

Идиотская идея: pseudo-блоки.