https://ru.bem.info/libs/bem-core/v2.6.0/desktop/i-bem/#Простое-наследование
Для доступа к методам родителя служит специальное поле контекста this.__base
По факту this.__base() делает инициализацию baseBlock. А методы базового блока стали методами текущего объявленного.
Нет, все правильно написано. если есть блок
Ас методомаи от него наследуется блокБс методомато вызовthis.__base()внутиБ#a- это вызовA#a, то есть доступ к методу родителя.Всё понял, спасибо. Но формулировка всё равно выходит некорректная.
Почему?
Потому что
this.__baseслужит для доступа к одному единственному методу соответсвующего текущему, а не к методам родителя."к методам родителя, соответствующим методам потомка".) Но да, возможно, текущую формулировку и стоит заменить, раз она может быть неправильно понята. Только тогда абзац текста получится вместо одного предложения.
@Guria не откажемся от уточняющего пулл-реквеста ;)
Подскажите по наследованию
Блок quals-menu инициализируется. При вызове метода hello - выводит в консоль hello, а this.__base() -> undefined
upd. Если сделать вывод this.__base -> undefined
@belozyorcev В блоке
quals-menuanchors-menuметод hello что возвращает?@zxqfox там нет этого метода
а в quals-menu выводит hello
@belozyorcev поэтому
console.log(this.__base());возвращает undefined.this.__baseнужно вызывать в дочернем методе, чтобы выполнить код из родительского.Что хочешь добиться?
Не пойму тебя. Можешь на примере?
Есть меню с якорями. Возникла необходимость создания такого меню для другой страницы но с некоторыми отличиями поведения и расширенными элементами. Чтобы не засорять базовый блок - хочу сделать на основе него новый.
Это я и так понял. Более конкретно ;-)
Нужен метод добавления/обновления элементов в блок. И реинициализации якорей
Создай
reinitв anchors-menu, и вызывай его простоthis.reinit.this.__base()нужен не для получения родителя, а для суперколла — вызова одноименного метода в родительском классе. Т.е. когда ты зовешьthis.__base()в методеhelloблокаquals-menu— происходит попытка вызвать методhelloвanchors-menu.@zxqfox пробовал и так тоже
Uncaught TypeError: this.reinit is not a functionВ родителе
В дочернем блоке
А если?
Попробовал сделать так, но элементы родителя опять недоступны
Пока решено просто дублировать anchors-menu (что нежелательно).
@tadatuta можешь разъяснить где ошибка?
@belozyorcev А вот так пробовал?)
В родителе
В дочернем блоке
В родителе
В дочернем блоке
В результате ничего не выводит
П.Н. Методы блока вызываю через инстанс jquery
@belozyorcev
@ilyar спасибо :) Думал в ту сторону, но не решался.
так всё работает. Странно почему в другом варианте не работает...
@belozyorcev Действительно не понятно почему, вариант из документации работает тут bem-components/common.blocks/button/button.js#L16.
@belozyorcev @ilyar наконец добрался проверить, у меня работает:
В результате в консоли, как и ожидается:
Возможно, блоки собирались в неправильном порядке или где-то были опечатки?