EN
4ok
4ok
28 ноября 2013
Read-only

Как расширить например для модуля i-bem__dom, хочу туда добавить несколько методов.

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

#dbelitsky
28 ноября 2013

this.__base: Ссылается на реализацию метода в базовом классе, от которого наследуется данный. Позволяет выполнить super call. Определен в методах экземпляра блока и в статических методах блока.

Пример: вызов (и модификация) метода _onClick родительского класса (базовой реализации метода в классе button).

 

DOM.decl({ block: 'my-button', baseBlock: 'button' }, {
    _onClick: function() {
        this.__base();
        this.doMore();
    }
);



Раздел про контекст
http://ru.bem.info/libs/bem-core/1.0.0/i-bem.js/i-bem-js/

#qfox
28 ноября 2013

Угу, Дима отписал. В 1.0 еще надо будет завернуть в `modules.define`, потому что асинхронность

#tadatuta
29 ноября 2013
Уточню, что модульная система используется в bem-core и не используется в bem-bl, так что заворачивать в modules.define('i-bem__dom') потребуется уже сейчас всем, кто использует bem-core (например, начиная проект с ветки bem-core (по умолчанию) в project-stub).
#toivonens
29 ноября 2013

Можно посмотреть на примере расширения модуля jquery https://github.com/varya/bem-js-tutorial/blob/master/components.bundles/013-live-init-bem-event/blocks/jquery/__rotate/jquery__rotate.js

#tadatuta
29 ноября 2013
Например, так:
modules.define('i-bem__dom', ['jquery'], function(provide, $, BEMDOM) {
    $.extend(BEMDOM, { newMethod: function() { /* ... */ } });
    provide(BEMDOM);
});
#aleksei-polyakoff2014
29 ноября 2013
Я решил так:

modules.define(
    'i-bem__dom',
    ['jquery'],
    function(provide, $, DOM)
{
    DOM.decl('i-bem__dom',
    {
        newMethod: function(e)
        {
            /* ... */
        }
    });

    provide(DOM);
});
Что скажешь по поводу твоего и моего варианта, в чем принципиальное различие с точки зрения реализации, чем один лучше другого или может они равноценны?
#alexbaumgertner
29 ноября 2013
#tadatuta
29 ноября 2013
Дима, подскажи, пожалуйста.
#ya-dfilatov
30 ноября 2013
В этих двух способах делается разное: в первом добавляется статический метод, во втором -- метод в прототип. Во втором способе будет правильно работать __base, в первом -- не будет.
Так что, второй способ более правильный.