bem-archive / bem-tools

Toolkit to work with files based on BEM methodology
http://bem.info/tools/bem/
MIT License
395 stars 72 forks source link

Mix BEMhtml #359

Closed alurin closed 11 years ago

alurin commented 11 years ago

Как заставить BEM-tools вызывать правила из миксированных блоков с технологией BEMHtml.

pages/example/example.bemjson.js:

({
    block: 'b-page',
    title: 'default',
    head: [
        { block: 'i-normalize'},
        { elem: 'css', url: '_example.css', ie: false },
        { elem: 'css', url: '_example.css', ie: true },
        { block: 'i-jquery', elem: 'core' },
        { elem: 'js', url: '_example.js' }
    ],
    content: {
        block: 'b-content',
        mix: [{'block': 'b-link-mixin'}],
        content: [
            {
                block: 'b-link',
                url: '/example.html',
                mix: [
                    {block: 'b-link-mixin', elem: 'link'}
                ],
                content: 'Help!!'
            },
        ]
    }
})

blocks/b-link-mixin/b-link-mixin.bemhtml:

block b-link-mixin {
    elem link {
        attrs: {
            attrs = this.ctx.attrs || {};
            attrs['test'] = 'Test';
            return attrs;
        }
    }
}

Ожидаемый результат:

<a class="b-link b-link-mixin__link" href="/example.html" test="Test">Help!!</a>

Реальный:

<a class="b-link b-link-mixin__link" href="/example.html">Help!!</a>
scf2k commented 11 years ago

/cc @veged @arikon

veged commented 11 years ago

Это особенность текущей реализации -- примиксованные сущности никак не влияют на шаблоны, только добавляют css-классы и js-параметры. Единственное, что учитывается, это шаблоны на миксы к тому, что примиксовано (см. коммит https://github.com/bem/bem-bl/commit/8e1b409b40fcce18040e3f1614f07c1a78715768 там есть тесты).

К сожалению, быстро это не исправить :-(

qfox commented 11 years ago

@veged Потому что может что-нибудь из приложений сломаться? Или от сложности внутренней логики?

veged commented 11 years ago

@zxqfox да ;-) и обратная совместимость, и есть неоднозначности, которые нужно придумать в какую сторону разрешать, а ещё и вопрос производительности

alurin commented 11 years ago

Это особенность текущей реализации -- примиксованные сущности никак не влияют на шаблоны, только добавляют css-классы и js-параметры.

Можно поподробней про Js параметры (ссылку на документацию). Изучение данного поведения BEM-tools и началось из-за того что появились проблемы с подключение нового js для уже существующего блока.

veged commented 11 years ago

вот подробнее про js -- https://github.com/bem/bem-core/blob/feature/initial/common.docs/reference/reference.ru.md#js

а какие появились проблемы?

alurin commented 11 years ago

Спасибо за ссылку.

Проблема была в том что, данный BEM js для переопределенного блока b-menu-vert(blocks) из bem-bl не работает:

BEM.DOM.decl('b-menu-vert', {
    onSetMod : {
        'js' : function() {
            console.log('JS: ', this);
        }
    }
}, {
    live: function () {
        console.log('Live: ', this);
    }
});

Вызывается только второй метод live, onSetMode 'js' не активируется

veged commented 11 years ago

Проблема в том, что такая декларация переопределяет базовое поведение b-menu-vert целиком, без вызова предыдущего метода (см. про this.__base http://bem.github.com/bem-bl/sets/common-desktop/i-bem/i-bem.ru.html#Rasshireniepovedeniya).

Базово меню инициализируется "лениво" только по клику на свои элементы (https://github.com/bem/bem-bl/blob/master/blocks-desktop/i-menu/i-menu.js#L43), поэтому не случалось console.log('JS: ', this).

console.log('Live: ', this) должно случаться, если в html есть хотя бы один, правильно оформленный (с параметрами через onclick), блок b-menu-vert.

alurin commented 11 years ago

Спасибо.

P.S. Не в тему: Есть шанс запретить рендеру BEMHtml создовать HTML тэги чтоб подменить у b-page элемент root?

veged commented 11 years ago

не очень понял вопрос про запрет создания HTML тегов -- можно завести отдельный issue с описанием проблемы/задачи, я постараюсь ответить