Не получается (без танцев с бубнами) сделать lazyInit
на элементе блока (в соотв. с Инициализация / Клиентский JavaScript (i-bem.js)... )
Хочется оживления по клику на кнопке внутри:
// …
lazyInit : true,
onInit : function() {
this._events(Button).on('click', this.prototype.onIconClick);
this.__base.apply(this, arguments);
}
// …
В общем, в onInit
без дополнительных упрашиваний даже не заглядывает.
Заглядывает (и сразу, конечно, инициализирует), если настойчиво искать конкретный элемент из уже живого родителя (напр., *.findChildElem(...)
).
Или если в шаблоне указывать как-ндь так:
// …
addMix()({ block : 'i-bem' }),
// …
ЧДНТ? Это нормальное поведение?
(Что-то не вижу, куда подевалась секция с назначением тегов. %((( )
А у элемента в шаблоне или в BEMJSON указано
js()(true)
/js: true
?Метки пропали при переезде на новую версию форума, есть задача на их внедрение: https://github.com/bem/bem-forum/issues/64
@tadatuta Да, как раз потом подумал, что надо было бы добавить: в шаблоне стоит
addJs()(true)
. (И при создании передаются js-овские параметры.)@tadatuta, кажется, вот ключ: элемент создаётся (среди прочих) в динамике (через
BEMDOM.update(..., BEMHTML.apply(...))
). Все новые элементы добавляются безi-bem
. У тех, которые позже находим через_findEntity
, оно, естественно, появляется. У прочих (тоже естественно?) -- нет.Как с этим бороться? Так и указывать, где необходимо, вручную, через
addMix
и т.п.?скорее всего шаблон просто не приезжает на клиент, т.к. не указан в зависимостях для клиентского JS (см. https://ru.bem.info/platform/deps/#%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9-%D0%BF%D0%BE-%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D0%B8)?
Нет. Как раз приезжает и отрабатывает. Как раз из него попадал микс про
i-bem
.Сейчас вроде докопался: похоже, это иногда встречающаяся проблема при динамической генерации, когда в
BEMHTML.apply
подсовываются не все модификаторы блока, для которого создаётся контент. Ранее для этого использовалсяgetMods
, сейчас (избегая хака с подхватыванием значений из_modCache
) приходится собирать нужное вручную. Иногда некоторые важные модификаторы упускаются. Похоже, это происходило здесь. %((( Т.е., сам недосмотрел. Сейчас выверил добавление модификаторов дляBEMHTML
, убрал принудительное мисшированиеi-bem
-- вроде, наконец, работает.UP: Правда, всё равно не оч. въехал, почему, если
addMix
отрабатывал, то не отрабатывалaddJs
... Загадка.UP-UP: Приключения продолжаются. Всё-таки гипотеза не верна. Всё-таки
i-bem
не добавляется. Однако, если делаю поиск этого элемента (даже если ничего не находится; элементы создаются в процессе работы -- бывает такое, что их ещё нет), то уже инициализируются статические свойства и вешается обработчик изonInit
(даже если нет классаi-bem
), после этого происходит нормальная ленивая инициализация при клике на любом элементе. Т.е., на стеке вижу вернувшийnull
findChildElem
, а от него по цепочке заводитсяonInit
. Если самому элементы не дёргать, то всё взлетает только если вручную добавитьi-bem
. Шайтан, однако!