Как правильно вызвать trigger и сказать, что произошло событие menuItemClick
this.emit('menuItemClick', {
domElem : elem,
group: this.elemParams(elem).group
});
если блоков menu на странице несколько, а событие нужно именно конкретного блока menu
В каком месте у меня ошибка? Что-то не хочет реагировать на событие клик
modules.define('menu-country', ['i-bem__dom', 'jquery'], function(provide, BEMDOM, $) {
provide(BEMDOM.decl(
this.name,
{
onElemSetMod: {
// Будем реагировать на изменение состояния элемента item
'item': {
// когда у него будет меняться модификатор state,
'state': function (elem, modName, modVal) {
// Когда мы получили состояние объекта, нам нужно оповестить другие блоки о том, что
// произошло. Для этого мы вызываем trigger и говорим, что произошло событие Click,
// заодно передаём важные параметры: элемент и его идентификатор метки.
this.emit('click', {
domElem : elem,
group: this.elemParams(elem).group
});
}
}
},
onTriggerElemClick: function (e) {
e.preventDefault();
var el = e.currentTarget;
// Потом точечно включим у того, по которому нажали.
this.toggleMod(el, 'state', 'active');
}
}, {
live: function () {
// Вешаем слушатель на клик.
this.liveBindTo('item', 'click', function (e) {
this.onTriggerElemClick(e);
});
this.on(this.domElem, 'click', function (e, data) {
var activeState = this.buildSelector('item', 'state', 'active').substr(1);
this.lastSelected && this.lastSelected.removeClass(activeState);
this.lastSelected = data.domElem;
});
}
}
));
});
Всем привет. Помогите найти ошибку. Есть блок (упрощенный вариант)
к нему i-bem.js файл
Работать не хочет. Где ошибка?
Пока из очевидного могу только порекомендовать вместо
buildSelector
вызыватьbuildClass
— тогда не придется делатьsubstr(1)
. Но мне в целом не очень нравится вариант сбрасывания модификатора с помощьюremoveClass
, для этого естьdelMod
у экземпляров блоков.А про остальное нужно больше подробностей, чтобы ответить. В целом триггер события через
this.emit('menuItemClick', data)
правильный. Чтобы подписаться на события такого типа от конкретного блока, необходимо иметь ссылку на инстанс блока либо его DOM-узел, тогда подписка будет выглядеть так:либо
@tadatuta Как правильно заменить
и сделать с delMod? Т.е. нам нужно удалить класс item_state_active у предыдущего элемента.
и
не работают
Block.prototype.delMod({?String|jQueryChain} elem, {String} mod)
Второй вариант почти правильный, только не
state_active
, аstate
.this.delMod(this.lastSelected, 'state');
— видимо, так.P.S. пока что delMod работает через setMod с пустой строкой, и хотя завязываться на это не стоит, но помогает запомнить параметры: https://github.com/bem/bem-core/blob/v2/common.blocks/i-bem/i-bem.vanilla.js#L485-L499
Сделал. Модификатор не удаляет
this.on('menuItemClick', function (e, data) {
— я вот в этой строчке вообще не уверен, почемуon
делается вlive
? контекст точно доезжает? выглядит нестабильно.Сейчас попробую заменить на
Отпишусь, но вроде все доезжало (когда с remove было)
Меня смущает, что this.lastSelected это объект, и как у него удалить модификатор?
Вообще задача такая, есть блок со списком, что-то вроде меню. По клику на определенный item нужно изменить его цвет. Когда кликаем по другому пункту, у предыдущего снять выделение, а новому поставить. Вариант с remove работает, с delMod нет. Причем в коде явно какие-то ошибки, потому что при подключении файла js данного блока у меня перестают работать все другие менюшки ( стандартные из bem-components) на странице. Я сперва думал что дело в названии блока и поменял его с menu на произвольное country, чтобы избежать повторений. Не помогло.
В js все объект. Даже объект. Но у объекта есть разные методы, которые меняют DOM дерево. Вообще, у тебя lastSelected это дом нода блока, лучше сохраняй ссылку на сам блок и делай
this.lastSelected.delMod('item', ...
Если задача ограничивается таким условием
то все просто: