Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

i-bem: Ленивая инициализация на элементе: проблемы #1475

Open
lilliputten opened this issue Feb 6, 2018 · 5 comments

Comments

@lilliputten
Copy link

lilliputten commented Feb 6, 2018

Не получается (без танцев с бубнами) сделать 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' }),
// …

ЧДНТ? Это нормальное поведение?

(Что-то не вижу, куда подевалась секция с назначением тегов. %((( )

@tadatuta
Copy link
Member

tadatuta commented Feb 7, 2018

А у элемента в шаблоне или в BEMJSON указано js()(true) / js: true?

Что-то не вижу, куда подевалась секция с назначением тегов

Метки пропали при переезде на новую версию форума, есть задача на их внедрение: bem/bem-forum#64

@lilliputten
Copy link
Author

lilliputten commented Feb 7, 2018

@tadatuta Да, как раз потом подумал, что надо было бы добавить: в шаблоне стоит addJs()(true). (И при создании передаются js-овские параметры.)

@lilliputten
Copy link
Author

lilliputten commented Feb 7, 2018

@tadatuta, кажется, вот ключ: элемент создаётся (среди прочих) в динамике (через BEMDOM.update(..., BEMHTML.apply(...))). Все новые элементы добавляются без i-bem. У тех, которые позже находим через _findEntity, оно, естественно, появляется. У прочих (тоже естественно?) -- нет.

Как с этим бороться? Так и указывать, где необходимо, вручную, через addMix и т.п.?

@tadatuta
Copy link
Member

tadatuta commented Feb 7, 2018

скорее всего шаблон просто не приезжает на клиент, т.к. не указан в зависимостях для клиентского 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)?

@lilliputten
Copy link
Author

lilliputten commented Feb 7, 2018

Нет. Как раз приезжает и отрабатывает. Как раз из него попадал микс про i-bem.

Сейчас вроде докопался: похоже, это иногда встречающаяся проблема при динамической генерации, когда в BEMHTML.apply подсовываются не все модификаторы блока, для которого создаётся контент. Ранее для этого использовался getMods, сейчас (избегая хака с подхватыванием значений из _modCache) приходится собирать нужное вручную. Иногда некоторые важные модификаторы упускаются. Похоже, это происходило здесь. %((( Т.е., сам недосмотрел. Сейчас выверил добавление модификаторов для BEMHTML, убрал принудительное мисширование i-bem -- вроде, наконец, работает.

UP: Правда, всё равно не оч. въехал, почему, если addMix отрабатывал, то не отрабатывал addJs... Загадка.

UP-UP: Приключения продолжаются. Всё-таки гипотеза не верна. Всё-таки i-bem не добавляется. Однако, если делаю поиск этого элемента (даже если ничего не находится; элементы создаются в процессе работы -- бывает такое, что их ещё нет), то уже инициализируются статические свойства и вешается обработчик из onInit (даже если нет класса i-bem), после этого происходит нормальная ленивая инициализация при клике на любом элементе. Т.е., на стеке вижу вернувший null findChildElem, а от него по цепочке заводится onInit. Если самому элементы не дёргать, то всё взлетает только если вручную добавить i-bem. Шайтан, однако!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants