Какой подход вы бы порекомендовали для управления всем приложением только с клавиатуры? Я нашел библиотеку Spotlight, но она зависит от enyojs, у которого, похоже, есть собственные компонентная модель и общий enyojs кажутся излишними.
Пока я слушаю события нажатия клавиш в app.component.ts
:
@HostListener('window:keydown', ['$event']) onKeydown(event: any) {
event.preventDefault();
this.mainKeydownHandler.handle(event.keyCode);
}
Каждый компонент, который хочет обрабатывать события нажатия клавиши, регистрируется в обработчиках MainKeydownHandler
, и когда происходит событие нажатия клавиши, MainKeydownHandler
делегирует событие зарегистрированному обработчику. Соответствующий обработчик определяется классом document.activeElement
(я не нашел более «углового2-подобного» способа получить текущий сфокусированный элемент) в методе handle MainKeydownHandler
. Итак, теперь мне нужно добавить соответствующее имя класса к группе элементов, на которых я хочу сосредоточиться.
Кроме того, обработчик компонента получает все выбираемые элементы с помощью:
@ViewChildren('selectable') elements: QueryList<ElementRef>;
поэтому мне нужно добавить #selectable
и класс с идентификатором обработчика к каждому элементу, на котором я хочу сосредоточиться. Затем обработчик компонента получает keyCode
и определяет, какой элемент выбрать следующим или вернуться к ранее выбранному элементу из другого компонента и так далее.
Этот подход кажется неудобным, включает довольно много кода, когда новый компонент хочет обрабатывать события нажатия клавиш, и бывают ситуации, когда компонент полностью теряет фокус: когда я удаляю элемент из какого-то списка, а затем этот компонент перерисовывается (какой-то сервис или MainKeydownHandler
мог запомнить, но это может привести к тому, что пользователю придется запоминать довольно много элементов при навигации по компонентам).
Есть ли лучший, более простой, более общий и более декларативный способ управления всем приложением angular2 только с помощью клавиатуры (события нажатия/нажатия клавиши)?
В качестве альтернативы разумно ли использовать Spotlight (с отделом enyojs) с angular2 для этого варианта использования? И можете ли вы предоставить работающий плункер с angular2+spotlight. Я не смог заставить эти два работать вместе.