Мое приложение регистрирует прослушиватели горячих клавиш, чтобы позволить пользователю выполнять действия только с клавиатуры.Вот пример:
@HostListener('document:keydown.meta.a', ['$event'])
selectAllHotkey(event: KeyboardEvent) {
event.preventDefault();
this.nodes = this.nodes.map(node => {
node.is_selected = true;
return node;
});
}
Этот метод находится внутри компонента и отлично работает как есть.Однако в последнее время пользователи запрашивали горячие клавиши для конкретной платформы (то есть Control вместо Command).Для этого я создал следующую функцию:
export function userAgentToggle<D>(window: Window, pcValue: D, osxValue: D): D {
if (window.navigator.userAgent.indexOf('Mac OS X') === -1) {
return pcValue;
} else {
return osxValue;
}
}
Все, что делает эта функция - возвращает один из двух аргументов, основанных на пользовательском агенте.Я могу применить это так:
@userAgentToggle(
window,
HostListener('document:keydown.control.a', ['$event']),
HostListener('document:keydown.meta.a', ['$event'])
)
selectAllHotkey(event: KeyboardEvent) {
// ...
}
И это прекрасно работает в разработке.Используя переключатель агента пользователя, я могу проверить, распознается ли каждая платформа и прослушивается ли соответствующий ключ.Тем не менее, он не работает в производстве.Если приложение проходит процесс сборки, то none прослушивателей событий запускается.
Обычно я предполагаю, что это проблема с моим кодом, но тот факт, что он работает в devзаставляет меня думать, что это может быть ошибка компилятора.Я делаю что-то не так, или я должен подать заявку на угловую ошибку?
Редактировать: Я попытался изменить положение вещей и в результате получил сообщение об ошибке Function calls are not supported in decorators
.Поиск в Google показал, что это ограничение компилятора Angular AoT.Я думаю, что такое динамическое поведение не поддерживается компилятором Angular.Я справился с этим, прослушав только событие keydown
и добавив второй декоратор, который может фильтровать до нужной комбинации клавиш.