Size: a a a

2019 August 23

И

Ильдар in БЭМ
Здравствуйте, по ibemjs вопрос. Слушаю события input из скласса, эта прослушка ловит события из инпутов дочерних блоков, чтоб это отсечь можно не слушать класс а слушать из экземляра но если я хочу остаться слушать в классе? через модификаторы, но тут гуру писали что модификаторы не за тем придуманы чтоб на них в ibemjs матчится в поиске блока. Делема.
источник

SB

Sergey Berezhnoy in БЭМ
Ильдар
Здравствуйте, по ibemjs вопрос. Слушаю события input из скласса, эта прослушка ловит события из инпутов дочерних блоков, чтоб это отсечь можно не слушать класс а слушать из экземляра но если я хочу остаться слушать в классе? через модификаторы, но тут гуру писали что модификаторы не за тем придуманы чтоб на них в ibemjs матчится в поиске блока. Делема.
подмешай к инпутам своего блока элементы своего блока и слушай на них
источник

И

Ильдар in БЭМ
Sergey Berezhnoy
подмешай к инпутам своего блока элементы своего блока и слушай на них
Тогда слушать domEvents у элементов?
источник

SB

Sergey Berezhnoy in БЭМ
Ильдар
Тогда слушать domEvents у элементов?
нет, так же делегированно, на классе, только добавить аргумент про микс с элементом
источник

И

Ильдар in БЭМ
Sergey Berezhnoy
нет, так же делегированно, на классе, только добавить аргумент про микс с элементом
Покажите если не трудно, не вижу в доках как слушать в классе микс
источник

И

Ильдар in БЭМ
Точнее блок с миксом
источник

z

zakaratcha in БЭМ
Насколько я помню, то прям правильный способ решения этой задачи такой:
1) создать этим примиксованным элементам свои js-инстансы;
2) слушать элементами клик примиксованной к ним кнопки и эмитить собственное БЭМ-событие;
3) в блоке слушать события, эмитируемые элементами.

Так получается вроде как много писанины, но прям правильно с точки зрения архитектуры. Внутреннее устройство элементов инкапсулированно внутри них и блок не в курсе, что там внутри элементов - кнопка или ещё что.
источник

И

Ильдар in БЭМ
zakaratcha
Насколько я помню, то прям правильный способ решения этой задачи такой:
1) создать этим примиксованным элементам свои js-инстансы;
2) слушать элементами клик примиксованной к ним кнопки и эмитить собственное БЭМ-событие;
3) в блоке слушать события, эмитируемые элементами.

Так получается вроде как много писанины, но прям правильно с точки зрения архитектуры. Внутреннее устройство элементов инкапсулированно внутри них и блок не в курсе, что там внутри элементов - кнопка или ещё что.
С точки зрения архитектуры правильно, а реализация громоздкая. Получается что раз мы не знаем в какой момент в блоке может внутри оказаться блок с таким же контроллом то нам для всех контролов нужно пилить миксы элементов с инстансами
источник

z

zakaratcha in БЭМ
Еще вариант (сильно менее правильный) - слушать не БЭМ-событие click на Button, а DOM-событие прямо на примиксованном элементе.
источник

И

Ильдар in БЭМ
zakaratcha
Еще вариант (сильно менее правильный) - слушать не БЭМ-событие click на Button, а DOM-событие прямо на примиксованном элементе.
Да, я его упоминал вроде, вариант Сергея интересен, но что-то я не пойму его идею
источник

SB

Sergey Berezhnoy in БЭМ
Ильдар
Покажите если не трудно, не вижу в доках как слушать в классе микс
в onInit своего блока берёшь класс элемента и от него делаешь уже байнд к блоку
источник

SB

Sergey Berezhnoy in БЭМ
Sergey Berezhnoy
в onInit своего блока берёшь класс элемента и от него делаешь уже байнд к блоку
не могу сходу пример найти — может у кого под рукой или по описанию получится
источник

И

Ильдар in БЭМ
Надеюсь что кто-нибудь скинет, мне понятней не стало) спасибо
источник

z

zakaratcha in БЭМ
Для решения похожих задач как-то даже начал плагин для i-bem писать, который упростил бы общение с DOM.
Т.к. местами реально не удобно)

https://github.com/zakaratcha/bem-dom-queries

Правда так и не доделал. Сначала тормознул разработку, потому что не удалось убедить принять пулл-реквест в bem-core, необходимый для работы плагина. А потом ещё и пришло понимание, что я сам им пользоваться не буду, т.к. Реакт и всё такое.
источник

SB

Sergey Berezhnoy in БЭМ
Ильдар
Надеюсь что кто-нибудь скинет, мне понятней не стало) спасибо
вот так можно
источник

SB

Sergey Berezhnoy in БЭМ
В блоке parrent:
modules.define('parent', [
   'i-bem-dom', 'parent__child'
], function(provide, bemDom, ParentChild) {
   provide(bemDom.declBlock(this.name, {
       _onParentChildClick: function() {
           // do something
       }
   }, {
       lazyInit: true,

       onInit: function() {
           this._events(ParentChild).on('click', this.prototype._onParentChildClick);
       }
   }));
});


В parent__child.js:

modules.define('parent__child', ['i-bem-dom', 'button'], function(provide, bemDom, Button) {

   provide(bemDom.declElem('parent', 'child', {
       _onClick() {
           this._emit('click');
       }
   }, {
       lazyInit: true,

       onInit() {
           this._events(Button).on('click', this.prototype._onClick);
       }
   }));

});
источник

SB

Sergey Berezhnoy in БЭМ
можно ещё чтобы сам бинд происходил в основном файле
источник

И

Ильдар in БЭМ
Sergey Berezhnoy
можно ещё чтобы сам бинд происходил в основном файле
Такую реализацию мы обсуждали, но это же не миксы, это инстанс элемента
источник

SB

Sergey Berezhnoy in БЭМ
Ильдар
Такую реализацию мы обсуждали, но это же не миксы, это инстанс элемента
это не через инстанс элемента, а через его класс
источник

z

zakaratcha in БЭМ
Да, это я выше не правильно выразился.
Имелась ввиду конечно "js-реализация" (т.е. класс), а не "инстанс".
То есть то, что в представленном коде.
источник