Всем доброго времени суток. Появилась необходимость доопределить js для блока Attach. А именно, при выборе картинки рисовать preview аватара. Код:
/* desktop.blocks/attach/attach.js */
modules.define('attach', function(provide, Attach) {
provide(Attach.decl({ modName: 'type', modVal: 'avatar' }, {
onSetMod: {
'js': {
'inited': function() {
this.__base.apply(this, arguments);
console.log('attach_type_avatar inited...');
}
}
},
_updateFileElem: function() {
this.__base.apply(this, arguments);
console.log('_updateFileElem');
//Do something...
},
_clear: function() {
this.__base.apply(this, arguments);
console.log('_clear');
//Do something...
}
}));
});
Методы срабатывают, "Супер-колл" работает, Функциональность блока не ломается, только после выбора файла, всплывает ошибка:
Uncaught TypeError: Cannot read property '_emitChange' of undefined
at Object._onChange (profile_settings.min.js:7695)
at n.fn.init.
Конкретно в этом месте:
_onChange : function() {
this.elem('no-file').detach();
this.getVal()?
this
._updateFileElem()
._emitChange() :
this._clear();
}
Как побороть ошибку? Доопределяю кнопки таким же образом - нет никаких ошибок.
для начала не
desktop.blocks/attach/attach.js
аdesktop.blocks/attach/_type/attach_type_avatar.js
Но проблема в том, что методы теряют свой контекст. Это точно весь код?
@belozer. С путем ошибся, но не суть, в сборку попадает. Да это весь код
Хмм.. Хорошо бы ещё узнать версию bem-components и bem-core.
В любом случае попробуй установить дебаггер в
_onChange
и посмотри на что ссылаетсяthis
и попробуй прямо из дебаггера вызвать методы. Т.к. это странно.П.Н. А шаблоны трогал? Если да, хорошо бы шаблон тоже приложить (на всякий случай).
@belozer. bem-components - 2.5.0, bem-core - 2.9.0. Шаблоны не трогал.
Останови дебаггер в
_onChange
и посмотри что возвращаетthis._updateFileElem()
@belozer. "Дебажнул". this._updateFileElem() - возвращает undefined. Поэтому и undefined._emitChange() - выдает ошибку. This - в _onChange указывает на блок Attach
@sinitsyn-alex проверь дебагером ещё здесь https://github.com/bem/bem-components/blob/v2.5.0/common.blocks/attach/attach.js#L90 и здесь https://github.com/bem/bem-core/blob/v2.9.0/common.blocks/i-bem/__dom/i-bem__dom.js#L845
@belozer. Очень странно... В первом обращении там везде ссылка на attach, потом на undefined. Вы сможете повторить мой код у себя на машине?
@belozer. Убираю метод _updateFileElem из уже доопределенного атача - ошибка пропадает. Остальные методы доопределенные не создают ошибок. Как я понял ошибка в библиотеке. Прошу помочь(
@sinitsyn-alex я слепой.... У тебя доопределён метод, но возвращаемое значение изменено. В attach возвращается this, а у тебя изменено на void (ничего не возвращается).
Правильней будет так
Можно ещё так
@belozer. Я очень благодарен Вам за решение моей проблемы, спасибо!
@belozer. Я правильно понял, что необходимо в каждом, доопределенном методе возвращать this? Хотя вот метод _clear я тоже доопределил и не возвратил this, а в оригинальном методе this возвращается, но ошибки ведь нет)
@sinitsyn-alex всё зависит от того что хочется решить переопределением метода. this возвращать не обязательно, если его не возвращает базовый метод.
Возвращать this нужно для работы chain синтаксиса. https://github.com/bem/bem-components/blob/v2.5.0/common.blocks/attach/attach.js#L64
вот что будет при попытке использовать переопределённый
_clear
@belozer Теперь всё стало на свои места. Спасибо!