bem-site / bem-forum-content-ru

Content BEM forum for Russian speak users
MIT License
56 stars 6 forks source link

Определение поведения блока с модификаторами с DOM-определением в JavaScript #380

Open bradbenetton opened 9 years ago

bradbenetton commented 9 years ago

Привет! Можно ли определить поведение блока с определенным модификатором с DOM-определением? Если я добавляю ['i-bem__dom'] в декларацию блока в JavaScript, то код перестает отрабатывать.

Пример BEMJSON:

{
    block: 'someblock',
    mods: {
        somemod: 'somevalue'
    },
    js: true,
    content: [
        'block content'
    ]
}

Пример JavaScript:

modules.define('someblock', ['i-bem__dom'], function(provide, BEMDOM) {
    provide(BEMDOM.decl({modName: 'somemod', modVal: 'somevalue'}, {
        onSetMod: {
            'js': {
                'inited': function() {
                    console.log('someblock inited with mod!');
                }
            }
        }
    }));
});
Guria commented 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!');
                }
            }
        }
    }));
});
apsavin commented 9 years ago

@Guria такой код будет работать, только если блок SomeBlock уже определен. Мне кажется, топикстартер не поймет этого.

bradbenetton commented 9 years ago

А как-то можно определить поведение блока с модификатором, если до этого блок не определен? то есть не определяя поведение блока без модификатора.

tadatuta commented 9 years ago

@bradbenetton модификатор — он на то и модификатор, чтобы модифицировать какое-то стандартное поведение. В терминах JS модификатор наследуется от базовой реализации класса.

А откуда такое желание?

bradbenetton commented 9 years ago

Например, кнопка прокрутки до метки на странице. Обычная кнопка ничего делает (в javascript), а кнопка прокрутки (т.е. с модификатором) прокручивает. Так и про другие блоки можно сказать.

apsavin commented 9 years ago

Это не кнопка прокручивает, это какой-то блок, у которого есть кнопка, прокручивает, когда кнопку нажимают. Понимаете, к чему я клоню?)

bradbenetton commented 9 years ago

Почему же кнопка не может прокручивать?

apsavin commented 9 years ago

Мммм... Ну, например, когда вы включаете свет - это ведь не кнопка делает так, чтобы светло было? Кнопка всего лишь "посылает сигнал". Кажется, это все, что может делать кнопка.)

tadatuta commented 9 years ago

@bradbenetton тут по смыслу подойдет микс кнопки (она даст визуальное представление) и некоего блока scroll-me-to-the-label, который и будет отвечать за поведение.

bradbenetton commented 9 years ago

ОК. Со светом я понял, но я все равно не понимаю, почему я не могу оставить блок без модификатора без javascript, а с модификатором прописать javascript. Я же могу такую логику реализовать для стилей: дефолтный блок без стилей, с модификатором - измененный внешний вид.

tadatuta commented 9 years ago

@bradbenetton все можно закостылять, но:

  1. Даже когда в HTML написано <div> и не подключены никакие стили, к этому <div> применятся браузерные дефолты
  2. Даже когда в JS ты создаешь пустой объект, у него автоматически есть прототип, от которого он отнаследовался.

Как я уже писал, модификатор в JS — это наследование. Если необходимо, чтобы JS-реализация блока была только у модификатора, можно воспользоваться хаком:

// объявляем модуль в виде строки с модификатором
modules.define('b1_m1_v1', ['i-bem__dom'], function(provide, BEMDOM) {
    provide(BEMDOM.decl(this.name, {}));
});

Тогда с точки зрения файловой системы это модификатор, а с точки зрения JS — это совершенно отдельный модуль, никак с b1 не связанный.

Но на самом деле подобное желание скорее всего указывает на какую-то проблему в архитектуре.