bem / bem-core

BEM Core Library
https://ru.bem.info/technologies/classic/i-bem/
Other
275 stars 94 forks source link

Конфликт с mix: {}, при установке модификатора блоку? #1255

Closed xmarinin closed 8 years ago

xmarinin commented 8 years ago

(см. комментарий в примерах)

Условно, есть такой BEMJSON:

{
    block: 'button',
    mix: {
        block: 'header',
        elem: 'button',
        mods: {
            type: 'friend'
        }
    }
}

И примерно такой клиентский JS-код:

modules.require(['i-bem__dom'], function (DOM) {
    DOM.decl('header', function () {
        onSetMod: {
            js: {
                inited: {
                    this.friendButton = this.elem('button', 'type', 'friend');
                    if (this.friendButton.length) {
                        this.friendButton = this.friendButton.bem('button');
                    }
                }
            }
        },
        toggleFriends: function () {
            // при клике не установит этот модификатор
            this.friendButton.setMod('type', 'action'); 

            // если имя не 'type', то установит
            this.friendButton.setMod('something-instead-of-type', 'action'); 
        },
    }, {
        live: function () {
            this.liveBindTo({elem: 'button', modName: 'type', modVal: 'friend'}, 'click', function (evt) {
                evt.preventDefault();
                this.toggleFriends();
            });

            return false;
        }
    });
});
dfilatov commented 8 years ago

this.friendButton.setMod('type', 'action'); такой код в принципе не может работать, this.friendButton это jquery-коллекция, у нее нет методов setMod.

dfilatov commented 8 years ago

должно работать так: this.setMod(this.friendButton, 'type', 'action')

xmarinin commented 8 years ago

Да, верно (ошибся, писал пример на коленке) — обновил. Тем не менее, это не относится к проблеме.

dfilatov commented 8 years ago

То есть кнопке нужно поставить модификатор с таким же именем, которое уже есть у элемента другого блока, я правильно понимаю?

xmarinin commented 8 years ago

Да.

veged commented 8 years ago

@Creamov оффтоп: вместо

this.friendButton = this.elem('button', 'type', 'friend');
if (this.friendButton.length) {
    this.friendButton = this.friendButton.bem('button');
}

лучше писать

this.friendButton = this.findBlockOn(this.elem('button', 'type', 'friend'), 'button');
veged commented 8 years ago

баг воспроизводится — будем чинить

dfilatov commented 8 years ago

Покопались подробнее — баг не воспроизводится (первый раз мы тест некорректный написали). Вот пример с jsfiddle, где все работает: http://jsfiddle.net/7oauweeL/1/