What is Angular2 way of creating global keyboard shortcuts (a.k.a. hotkeys)?

后端 未结 3 1976
花落未央
花落未央 2020-12-29 20:06

What would be proper way of creating global keyboard shortcuts (a.k.a. hotkeys) in Angular2 application?

Let\'s say good starting point would be to get working: \"?

相关标签:
3条回答
  • 2020-12-29 20:53

    You can use a library I created called angular2-hotkeys

    It lets you create hotkeys like this:

    constructor(private _hotkeysService: HotkeysService) {
      this._hotkeysService.add(new Hotkey('meta+shift+g', (event: KeyboardEvent) => {
        console.log('Typed hotkey');
        return false; // Prevent bubbling
    }));  }
    
    0 讨论(0)
  • 2020-12-29 20:59

    A simple and elegant solution will look like as following:-

    Create a global service, which will store the bindings of shortcuts with clickable elements. Note:- Use NgOnDestroy, for removing bindings on component is destroyed.

    Now create a directive, which will take keycodes as input like this.

    <button [angularHotKey]="[17,78]">New Document</button>
    <!-- CTRL = 17 & n = 78 -->
    

    Now in your root most component, listen keypresses and use them as indices for locating Elements in Global Service for HotKeys. Now on getting the reference do something like this.

    I assume you have formatted recorded keycodes in this format = 1-23-32-... , dont forget to sort them in ascending/descending format, both while adding it to keypair array in service and while checking

    if(this.keypair[combo].length)this.keypair[combo].click();
    

    this.keypair[combo] contain reference of element on which angularHotKey directive was added.

    Further Notes: 1.) In angularHotKey directive while adding new keypair and element/clickable reference please check if there don't exist pairing with same combo, if yes throw a exception, it will be helpful while debugging, and prevent you from doing silly mistakes, and in Angular 2 component class,in ngOnDestroy method define a logic of removing all shortcuts paired with it's child elements.

    Visit http://keycode.info/ for getting keycodes for all types of keys present on your keyboard.

    JavaScript multiple keys pressed at once A answer with every little detail about how to deal with combo key presses

    0 讨论(0)
  • 2020-12-29 21:05

    You can use this syntax in your template

    <div (window:keydown)="doSomething($event)">click me<div>
    

    to call this method in your component

    doSomething($event) {
      // read keyCode or other properties 
      // from event and execute a command
    } 
    

    To listen on the host component itself

    @Component({
      selector: 'app-component',
      host: { '(window:keydown)': 'doSomething($event)' },
    })
    class AppComponent { 
      doSomething($event) {
        ...
      }
    }
    

    or by this equivalent syntax

    @Component({
      selector: 'app-component',
    })
    class AppComponent { 
      @HostListener('window:keydown', ['$event'])
      doSomething($event) {
        ...
      }
    }
    
    0 讨论(0)
提交回复
热议问题