Вопрос №1
modules.define('page',
['i-bem-dom'],
function (provide, bemDom) {
provide(bemDom.declBlock(this.name, {
onSetMod: {
'js': {
'inited': function () {
// this.findChildBlock(FormLogin)._events().on('login:success', this._onLoginSuccess)
}
}
}
}))
})
// modules.require('page', function () {})
инициализация происходит только если раскомментировать последнюю строчку. Это нормально или я что-то не так сделал?
Вопрос №2.
Блок page я планирую использовать как глобального диспетчера. У page есть разные view (со своими наборами слушателей). По сути будет 3 view. (login, user, admin),
При переходе из view в другой view нужно менять вешать/убирать слушателей. Как это реализовать?
Пока начал эксперементировать с модификаторами. Но такой код срабатывает только при инициализации.
modules.define('page',
['form-login'],
function (provide, FormLogin, Page) {
Page.declMod({ modName: 'view', modVal: 'login' }, {
onSetMod: {
'js': {
'inited': function () {
console.log('login view')
// console.log(this.findChildBlock(FormLogin))
this.findChildBlock(FormLogin)._events().on('login:success', this._onLoginSuccess)
}
}
},
_onLoginSuccess: function (e, data) {
console.log(data)
}
})
provide(Page)
}
)
Вопрос №3
Какая разница между
provide(bemDom.declBlock())
и
bemDom.declBlock()
provide(bemDom)
Упс, прости, потерял этот пост :(
Вопрос №1: https://github.com/bem/bem-core/issues/1395
Вопрос №2: Если я правильно понял задачу, то тебе нужно использовать реакцию на изменение модификаторов:
Но вообще я бы добавил какой-нибудь дополнительный блок
app
, чтобы не завязываться наpage
(наверняка тебе понадобится шаблонизация на клиенте и нет никакого смысла тащить обвязку).Вопрос №3: Разницы нет.
Page планируется только для разбивки логики на разные scope (view), которые зависят от конкретного пользователя, какие у него права.
Вся основная работа будет в блоке content (app), который будет иметь различные обработчики страниц (content_handler_users, content_handler_settings и т.д.)
А вот и есть. Если в сделать
а в потом пытаться задекларировать модификатор
Словим ошибку: Page.declMod is not a function
Но а если писать сразу в провайдер
provide(bemDom.declBlock())
, то всё норм.// cc @tadatuta
Да, ты прав. Разницы не было до
v4
. ТеперьdeclBlock
возвращает класс блока и его и требуется запровайдить. Так что валидным вариантом унестиprovide
на отдельную строку будет:Возник вопрос по инициализации блока :) Очередной.
Атрибут
data-bem
(имя блока) не обязательный, если у блока ленивая инициализация? Я всегда думал, что он обязателен, но примиксованный блок (animation) инициализируется и без него.Доступ к инстансу анимации получаю так:
Что нужно минимум в html для того, чтобы получить инстанс примиксованного блока с ленивой инициализацией?
А то в голове какая-то смута сейчас.
//cc @veged @tadatuta
если делается явный поиск/получение блока, то он инициализируется даже при отсутствии параметров
но если явного поиска/получения нет, то без параметров не вызовется даже ленивая инициализация (т. к. изначально блоки ищутся в доме по data-bem
т.е. даже
i-bem
класс не нужен? Самый минимум - это класс блока на ноде. Я правильно понял?только если делаетс явное обращение, тогда не нужен
НО,я бы не рекомендовал закладываться на это поведение, это скорее недокументированная особенность текущей реализации — лучше считать, что и i-bem и data-bem нужны всегда для блоков у которых есть js технология
@veged ок, спасибо. А то у меня путаница в голове возникла, когда заметил это :snowboarder: