Угловой 6: декоратор HostListener сломан производственной сборки - PullRequest
0 голосов
/ 24 октября 2018

Мое приложение регистрирует прослушиватели горячих клавиш, чтобы позволить пользователю выполнять действия только с клавиатуры.Вот пример:

  @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 и добавив второй декоратор, который может фильтровать до нужной комбинации клавиш.

...