Open bradbenetton opened 9 years ago
modules.define('someblock', ['i-bem__dom'], function(provide, BEMDOM, Someblock) {
provide(Someblock.decl({modName: 'somemod', modVal: 'somevalue'}, {
onSetMod: {
'js': {
'inited': function() {
console.log('someblock inited with mod!');
}
}
}
}));
});
@Guria такой код будет работать, только если блок SomeBlock уже определен. Мне кажется, топикстартер не поймет этого.
А как-то можно определить поведение блока с модификатором, если до этого блок не определен? то есть не определяя поведение блока без модификатора.
@bradbenetton модификатор — он на то и модификатор, чтобы модифицировать какое-то стандартное поведение. В терминах JS модификатор наследуется от базовой реализации класса.
А откуда такое желание?
Например, кнопка прокрутки до метки на странице. Обычная кнопка ничего делает (в javascript), а кнопка прокрутки (т.е. с модификатором) прокручивает. Так и про другие блоки можно сказать.
Это не кнопка прокручивает, это какой-то блок, у которого есть кнопка, прокручивает, когда кнопку нажимают. Понимаете, к чему я клоню?)
Почему же кнопка не может прокручивать?
Мммм... Ну, например, когда вы включаете свет - это ведь не кнопка делает так, чтобы светло было? Кнопка всего лишь "посылает сигнал". Кажется, это все, что может делать кнопка.)
@bradbenetton тут по смыслу подойдет микс кнопки (она даст визуальное представление) и некоего блока scroll-me-to-the-label
, который и будет отвечать за поведение.
ОК. Со светом я понял, но я все равно не понимаю, почему я не могу оставить блок без модификатора без javascript, а с модификатором прописать javascript. Я же могу такую логику реализовать для стилей: дефолтный блок без стилей, с модификатором - измененный внешний вид.
@bradbenetton все можно закостылять, но:
<div>
и не подключены никакие стили, к этому <div>
применятся браузерные дефолтыКак я уже писал, модификатор в JS — это наследование. Если необходимо, чтобы JS-реализация блока была только у модификатора, можно воспользоваться хаком:
// объявляем модуль в виде строки с модификатором
modules.define('b1_m1_v1', ['i-bem__dom'], function(provide, BEMDOM) {
provide(BEMDOM.decl(this.name, {}));
});
Тогда с точки зрения файловой системы это модификатор, а с точки зрения JS — это совершенно отдельный модуль, никак с b1
не связанный.
Но на самом деле подобное желание скорее всего указывает на какую-то проблему в архитектуре.
Привет! Можно ли определить поведение блока с определенным модификатором с DOM-определением? Если я добавляю ['i-bem__dom'] в декларацию блока в JavaScript, то код перестает отрабатывать.
Пример BEMJSON:
Пример JavaScript: