【发布时间】:2020-11-20 20:29:10
【问题描述】:
在 Angular2 应用程序中创建全局键盘快捷键(又名热键)的正确方法是什么?
假设好的起点是开始工作:“?”用于备忘单和“Alt+s”用于提交表单。
我应该映射“?”以某种方式应用于主要组件,然后开发将应用于那些应该响应特定热键的组件的属性指令,但是 - 我如何防止输入字段响应“?”。
【问题讨论】:
标签: angular
在 Angular2 应用程序中创建全局键盘快捷键(又名热键)的正确方法是什么?
假设好的起点是开始工作:“?”用于备忘单和“Alt+s”用于提交表单。
我应该映射“?”以某种方式应用于主要组件,然后开发将应用于那些应该响应特定热键的组件的属性指令,但是 - 我如何防止输入字段响应“?”。
【问题讨论】:
标签: angular
您可以在模板中使用此语法
<div (window:keydown)="doSomething($event)">click me<div>
在你的组件中调用这个方法
doSomething($event) {
// read keyCode or other properties
// from event and execute a command
}
监听宿主组件本身
@Component({
selector: 'app-component',
host: { '(window:keydown)': 'doSomething($event)' },
})
class AppComponent {
doSomething($event) {
...
}
}
或通过这种等效的语法
@Component({
selector: 'app-component',
})
class AppComponent {
@HostListener('window:keydown', ['$event'])
doSomething($event) {
...
}
}
【讨论】:
? 不支持 '(window:keydown.?)`。可能只有github.com/angular/angular/blob/…中列出的代码
你可以使用我创建的名为angular2-hotkeys的库
它可以让你像这样创建热键:
constructor(private _hotkeysService: HotkeysService) {
this._hotkeysService.add(new Hotkey('meta+shift+g', (event: KeyboardEvent) => {
console.log('Typed hotkey');
return false; // Prevent bubbling
})); }
【讨论】:
一个简单而优雅的解决方案如下所示:-
创建一个全局服务,它将存储快捷方式与可点击元素的绑定。 注意:- 使用 NgOnDestroy,用于删除组件上的绑定被破坏。
现在创建一个指令,它将像这样将键码作为输入。
<button [angularHotKey]="[17,78]">New Document</button>
<!-- CTRL = 17 & n = 78 -->
现在,在您的最根组件中,侦听按键并将它们用作在热键的全局服务中定位元素的索引。现在在获得参考时做这样的事情。
我假设您已将录制的键码格式化为这种格式 = 1-23-32-... ,不要忘记按升序/降序对它们进行排序, 将其添加到服务中的密钥对数组和检查时
if(this.keypair[combo].length)this.keypair[combo].click();
this.keypair[combo] 包含添加了angularHotKey directive 的元素的引用。
补充说明:
1.) 在angularHotKey 指令中添加新的密钥对和元素/可点击引用请检查是否不存在与相同组合的配对,如果是则抛出异常,这将有助于调试,并防止您犯下愚蠢的错误,并且在 Angular 2 组件类中,在 ngOnDestroy 方法中定义了删除与其子元素配对的所有快捷方式的逻辑。
访问http://keycode.info/ 获取键盘上所有类型键的键码。
JavaScript multiple keys pressed at once关于如何处理组合按键的每一个小细节的答案
【讨论】: