Хочу сказать спасибо @tadatuta за ревью кода моего компонента меню представленного на конкурс.
Замечания были очень полезные.
Однако часть волнующих меня вопросов не была освещена, потому буду выносить их в отдельные посты на форум.
Начну с вопроса обозначенного в заголовке.
Мой компонент построен на блоках menu, menu-item, button и прочих из библиотеки bem-components.
Для реализации второго уровня в меню, я воспользовался элементом group блока menu задав ему абсолютное позиционирование и overflow-y: auto.
Однако, код метода _scrollToItem не был рассчитан на такое рассположение пунктов меню и мне понадобилось переопределить его: я скопировал код метода из библиотеки, сделал автоматическое определение контейнера со скроллом и изменил функцию анимации.
Так же мне не понравилось, что вызов метода _scrollToItem происходит при наведении мышью. Пришлось переопределять метод _onItemHover.
Потом выяснилось, что клавиатурная навигация для переключения выбранного пункта меню устанавливает ему модификатор hovered (этому я посвящу отдельный пост). Методы _onKeyDown и _onItemClick тоже пришлось переопределять.
Всю эту красоту я оформил, как модификатор menu_fix_scroll, чтобы не ломать блок menu в других местах и разместил его как модификатор моего блока kg-menu_fix_scroll. Этот модификатор указан как зависимость самого блока kg-menu.
Вот тут я подошёл к вопросам:
- правильно ли я решил, что доопределения библиотечного блока, которые необходимы только моему блоку и нигде более правильно разместить внутри моего блока?
- критично ли, что
kg-menu_fix_scroll.js фактически описывает menu_fix_scroll?
- есть ли другие более изящные пути решения такой проблемы?
Сейчас я делаю поле типа autocomplete в рамках компонента поиска. Есть мысль сделать его на базе dropdown, определив новый модификатор dropdown_switcher_input.
Снова возникают вопросы означенные выше.
Вариант 1.
В блок dropdown добавить модификатор _switcher_input. (Будет странно смотреться, как не совсем самостоятельная сущность. Скорее всего не получится выделить общие правила для отображения попапа, оставив только метод аналогичный onSwitcherClick)
Использовать его в блоке autocomplete (или даже в модификаторе _type_autocomplete блока input).
Затем всё это использовать это в моём блоке поиска.
Вариант 2.
Определять модификатор dropdown_switcher_input внутри autocomplete / input_type_autocomplete.
Вариант 3.
Не использовать код dropdown и реализовать autocomplete / input_type_autocomplete самостоятельно.
Вариант 4.
Только что придумал вариант, похожий на правильный ответ.
Наследовать autocomplete (input_type_autocomplete врядли получится?) от dropdown.