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

Хочу сказать спасибо @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.