Пытаюсь менять стиль блока, после нажатия на элемент в нём (ctrl). Но ничего, кроме ошибки "TypeError: g.handler.apply is not a function", не выходит.
modules.define('b-map-filter-bar', ['i-bem__dom'], function(provide, BEMDOM) {
BEMDOM.decl(this.name, {
onSetMod: {
'js' : {
'inited' : function() {
this.setMod('display', true);
console.log('init');
this.__ctrl = this.elem('ctrl');
this.__ctrl.on('click', this._onClick, this);
}
},
'theme': {
'tosecond': function() {
this.__ctrl.text('Привет');
},
'tofirst': function() {
this.__ctrl.text('Пока');
}
}
},
prevTheme: '',
_onClick: function() {
if(this.prevTheme === 'tosecond') {
this.setMod('theme', 'tofirst');
this.prevTheme = 'tofirst';
} else {
this.setMod('theme', 'tosecond');
this.prevTheme('theme', 'tosecond');
}
}
});
provide(BEMDOM);
});
ЕМНИП, это
можно записать проще:
https://github.com/bem/bem-core/blob/v2/common.blocks/i-bem/i-bem.vanilla.js#L444
В твоем случае:
А ошибка странная, не знаю, что за
g.handler
. Это точно из этого кода? Может быть еще что-то на странице есть?ничего не подключено. Только сгенерированный JS.
Если из контекста убрат this
то _onClick ищет функцию на элементе
this.prevTheme('theme', 'tosecond')
а зачем вы переменную как функцию вызываете? Правильно сказал @zxqfox, надо использоватьtoggleMod
:Lol. Вы через jquery событие вешаете. Сделайте
this.bindTo(elem, click, handler)
, и все будет ок)вообще не пойму из-за чего ошибка... Ничего не помогает
Сделал пока через "bindTo". Но хочется через "on"
@zxqfox на вэбинаре использовался метод "on"
http://youtu.be/1GWoMnYldYc?t=2h15m58s
ты что-то путаешь. Он правильно подписался
оффтоп, но @belozyorcev не нужно сохранять
this.__ctrl
, так какthis.elem
кеширующий метод. А если по теме - тоthis.elem
возвращает jQuery объект, так чтоon
- это метод из jQuery api и в него нельзя передать контекст. ИспользуйтеbindTo
.Действительно :) В видео использовался метод для нахождения блоков, а не элементов :)
@apsavin. Спасибо за разъянения
@sipayRT Он подписался через это, и контекст там соотв (дом-нода). Нет?
@belozyorcev @apsavin правильно написал ;) и в вебинаре из-за этого у него и не заработало сразу ;-)
.on
будет, скорее всего, в bem-core v3, если это будет возможно.Я уже сам запутался в Ваших доводах.)) В вебинаре я использовал
on
для подписки наBEM
событие, которое генерит блокlink
изbem-components
. Я его ранее нашел и положил в в полеthis.__button
. Не сработал js потому что я вместо того, чтобы найти один блокicon
с помощью методаfindBlockInside
, позвал методfindBlocksInside
, который мне вернул массив из одного элемента. И я пытался у массива вызвать методsetMod
, что и было ошибкой.По поводу вашей ситуации, если подписываешься на BEM событие используешь
on
, если на ДОМ событие, тогда нужно использовать унифицированный метод из i-bem.jsbindTo
. jQuery методon
использовать не нужно.Нет :) он подписался через это
@sipayRT Нет, в оригинальной версии у него было:
И
this.__ctrl
(результатthis.elem(...)
) — это ровно jQuery-chain.