BACK
Use casesKeyboard layers — global/list/modal shortcuts
Use cases · 50

Keyboard layers — global/list/modal shortcuts

Паттерн

Enter в списке — «открыть выделенный». Enter в модальном окне — «подтвердить». Escape в модалке — «закрыть», в дропдауне — «свернуть». Один и тот же ключ значит разное в зависимости от текущего scope.

Какую проблему решаем

Если делать глобальный document.keydown handler с if-ами — он будет перехватывать Enter внутри input полей, ломать форму, конфликтовать с компонентами. Маршрутизация по scope — единственный sane вариант.

Операторы и зачем они нужны

  • Subject — симулирует fromEvent(document, 'keydown').
  • withLatestFrom(scope$) — на каждый keydown берём АКТУАЛЬНЫЙ scope в этот момент.
  • filter — пропускаем дальше только если в текущем scope этот key зарегистрирован.
  • map — превращаем (key, scope) в конкретную команду.

Подводные камни

  • Без scope глобальный handler перехватит Enter внутри input/textarea и сломает ввод текста.
  • mergeMap здесь не нужен — резолвинг команд синхронный.
  • Не забывайте игнорировать shortcuts когда фокус в input/textarea (или поднимать их priority явно).

Что в итоге получаем

Команда определяется декларативно из пары (key, scope). Никаких неявных стеков и конфликтующих handlers.

script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...