bem-site / bem-forum-content-ru

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

Динамическое создание блоков #390

Open KondakovArtem opened 9 years ago

KondakovArtem commented 9 years ago

Добрый день. Разбираюсь с БЭМом. Предположим, я реализовал блок label, использую его в технологии BEMJSON, по нему формируется HTML через BEMHTML, привязывается js, все хорошо. Встала задача динамически создавать блок label на уже отображенной странице по действиям пользователя.

Насколько я понимаю, мне необходимо сформировать HTML этого блока и проинициализировать его. что- то типа createLabel(parentBlock,params)

Как правильно реализовать эту возможность?

apsavin commented 9 years ago

BEMHTML можно использовать на клиенте. в i-bem__dom есть методы, которые вставляют строки в DOM и инициализируют блоки, получившиеся в результате.

tadatuta commented 9 years ago

@KondakovArtem можно добавить необходимые шаблоны на клиент и генерировать разметку в рантайме.

В label.deps.js добавить

[
    {
        tech: 'js',
        shouldDeps: [
            { block: 'label', tech: 'bemhtml' }
        ]
    }
]

Читается пример как «Технология js данного блока зависит от технологии bemhtml блока label» (в данном случае — самого себя).

После этого, если правильно сконфигурирована сборка (примером может служить https://github.com/bem/project-stub/tree/bem-core/.enb/make.js) шаблоны станут доступны в виде модуля:

modules.define('my-block', ['i-bem__dom', 'BEMHTML'], function(provide, BEMDOM, BEMHTML) {

provide(BEMDOM.decl(this.name, {
    onSetMod: {
        {
            js: {
                inited: function() {
                    this.bindTo('click', function() {
                        BEMDOM.append(this.domElem, BEMHTML.apply({ block: 'label', content: 'моя новая метка' }));
                    });
                }
            }
        }
    }
}));

});