Возникла непонятная проблема. Происходит инициализация блока на дом ноде, которой в bemhtml было задано js()(false). В html всё нормально: класса i-bem нет, аттрибута data-bem тоже. Есть только имя класса блока. Однако при наступлении live события этой DOM ноде внезапно инициализируется блок, при этом появляются и data-bem и block_js_inited и i-bem. Пока не удалось локализовать в кусок, который мог бы опубликовать. Может есть идеи почему так может произойти?
Нашёл: в bemjson
в js
При клике в первый инпут инициализируется blockA у которого выставленно js(false). Происходит это только при присутствии на странице другого blockA у которого выставленно js(true).
Сообщу отдельно если удастся сузить пример.
Укоротил:
При клике в инпут инициализируются оба блока. Кажется, это довольно серьёзная бага.
@dfilatov Дима, подскажи, пожалуйста, это бага или фича?
Это не бага, это особенность live-блоков. Не может из них часть вдруг оказаться совсем без js. Непонятен реальный кейс такого использования.
Понял. Я нарвался на это дело случайно и не уверен, что мне этот кейс действительно нужен. Более того, в текущем исполнении он явно пахнет. Если внимательно посмотреть первый комментарий можно увидеть, что же я пытался изобразить:
applyCtx({ block: 'blockA', js: false })Тем не менее такое поведение live инициализации показалось довольно нелогичным, хотя бы потому что вообще не ясно каким образом вопреки документации инициализируется блок без i-bem и data-bem.
Я покурил дебаггер и есть вопрос: BEMDOM._findBlocks() действительно задуман искать все блоки, в том числе без js реализации? Кажется можно дополнить селектор проверкой класса
i-bemBEM_CLASS.Как-то пахнет, да.
Надо бы посмотреть много ли сломается, если поменять логику. Сложно оценить, стоит ли это менять так сразу.
@Guria поиск блоков действительно задуман так, что ищутся все блоки, даже без собственного js-представления — это полезно, когда, например, верхнеуровневый блок хочет переставлять модификаторы внутренним, при этом внутренние могут быть без js
а можно рассказать про конкретную задачу — а то, судя по вопросам, кажется, что это можно было бы делать други, более предусмотренным нами, способом ;-)
Конечно же мне подходят более предусмотренные способы, которыми я уже восспользовался. Оригинальный вопрос снимается. Остаётся только небольшая недокументированная магия, когда происходит инициализация блока, который на первый взгляд инициализироваться не должен был. И ещё сохраняется некоторая неконсистентность: "нежелательной" инициализации не происходило, если на странице не было второго такого же блока, но со включенным
js: true.вообще мы не подразумевали, что инициализация может быть "нежелательной" — на блок либо есть js и тогда он предусматривает и нормально переносит инициализацию, либо js нет и тогда инициализация не создаёт никаких видимых эффектов
если на странице не встретилось ни одного
js: trueблока, то иliveсекция не исполняется — это специальная оптимизация