Войти с помощью github
Форум /

Возникла проблема с this. Каждый с ней сталкивался, когда приходилось что-то делать с фильтрами или чем-то другим. Приходилось кэшировать в переменную self Или, например, каждый раз при смене модификатора элемента приходилось писать что-то типо этого

this.setMod( this.elem('right'), 'size', 'xxxxl' );

много раз приходится дублировать this... А иногда не сразу понятно на что он ссылается. При создании одного из блоков я подобрал для себя решение, может кому пригодится.

modules.define('scroller', ['i-bem__dom', 'jquery'], function(provide, BEMDOM, $) {

var block;

function elem(name) {
    return block.elem(name);
}

BEMDOM.decl(this.name, {
    onSetMod: {
        'js' : {
            'inited' : function() {
                block = this;
            }
        }
    },
}, {});

provide(BEMDOM);

});

После чего к блоку всегда можно обращаться через block а к элементу через elem('name').

например установка модификатора для элемента теперь будет выглядеть так:

block.setMod( elem('right'), 'size', 'xxxxl' );

из плюсов

  • однозначность block
  • более короткая запись для доступа к элементам elem('name')
  • 4 строчки кода

П.Н. Данное решение актуально для bem-core@v2, в bem-core@v3 - решение будет лучше из коробки.


@tatudata ниже объяснил, почему так нельзя. В ответах есть другие предложения.


Что есть в ответах

Добавлена реализация короткой записи модификации элементов вида:

this.el('body')
       .setMod('size', 'xxx')
       .setMod('color', 'gray);