Записал видео что бы было понятно. https://yadi.sk/i/OWFoBa18cP3j4
Это два самостоятельных блока, но в одном состоянии блока more может использоваться блок button над которым хочется производить какие то действия в зависимости от состояния блока родителя. Сейчас есть баг, он заключается в том что, когда нет hover на button то соответственно модификатор этого блока убирается. Но остается hover на блоке родителе more который должен транслировать этот hover на внутренний блок button
Как сделать правильно, что бы было ожидаемое поведение? Не хочу через стили.
Написал такой код:
modules.define('more', ['i-bem__dom', 'control'], function(provide, BEMDOM, Control) {
provide(BEMDOM.decl({ block : this.name, modName : 'type', modVal: 'link', baseBlock : Control }, {
onSetMod : {
'js' : {
'inited' : function() {
this._button = this.findBlockInside('button');
}
},
'hovered' : {
'true' : function() {
this.__base.apply(this, arguments);
this._button.setMod('hovered');
},
'' : function() {
this.__base.apply(this, arguments);
this._button.delMod('hovered');
}
}
}
}));
});
Конкретно данный код можно улучшить в 2 местах:
А уж насколько правильно само желание эмулировать состояние
hovered— решать тебе. Как по мне, контрол на видео — это единый блок, у которого необходимая визуальная реакция должна задаваться просто через@tadatuta на видео не видно, но в дизайне это очень самостоятельных блока. И в одном из состояний
moreестьbuttonНе совсем понял
buttonинициализировать внутри? Как это будет связано с моей задачей?hoveredв любое значение (скобку добавил).@tadatuta что-то не работает как ожидается ((( всеравно когда мышка выходит за
buttonвнутриmoreсbuttonубирается модификаторhovered@voischev я неправильно прочитал твой исходный вопрос :( изменения, которые предложил никак не меняют логику твоего исходного кода, только лишь чуть-чуть экономят на отложенной инициализации и строчках кода.
Умозрительно, происходит следущющее:
more, твой код выставляет_hoveredнаbutton.button, внутри уже благодаря кодуbuttonпроисходит попытка снова выставить_hovered, для пользователя все ок.button, обработчик удаляет_hovered.Чтобы этого не происходило, ты можешь выставлять для
buttonвнутриmoreнекий модификатор, в котором отписываться от исходной реакции на ховер (она реализована в https://github.com/bem/bem-components/blob/v2/desktop.blocks/control/control.js#L16-L33)