angular - 我可以使用多个@hoSTListener 或基于浏览器的事件吗?

标签 angular events

我在 Angular7 指令中使用 @hoSTListener。我可以为此使用多个事件吗?
问题是在 Android 之外的任何设备上都可以监听 'keydown' 事件,因为后者没有关键事件。
切换到 'input' 事件解决了这个问题,但不包括 Firefox(可能还有 Edge),因为后者没有 'inputType'(和其他东西)导致实际输入字段允许任何输入。
所以我的目标是能够对 Firefox 和 Edge 使用“keydown”,对其他任何东西使用“input”。那可能吗?
使用 'keydown'、'keypress' 和 'input' 事件

    @HostListener('input', ['$event'])
    onInput(event: any) {
        this.parseKeyDown(event);
    }
    parseKeyDown(event: any) {
        if (event.inputType === 'deleteContentBackward' || event.inputType === 'deleteContentForward') {
            let str = this.ngModel.substr(0, this.ngModel.length - 1);
            if (str.length === 0) {
                str = '0';
            }
            // handle 'str'
        }
...
        if (e.inputType === 'insertText' && e.data.match(this.regex)) {
            // handle ngModel
        }
    }
代码缩短以提高可读性。
这适用于除 Firefox/Edge 之外的任何东西,其中按退格键或删除键会删除最后一个字符。在 Firefox 中,该字段只是回退到文本字段,允许任何 GUI 输入并且不会更新 ngModel。
由于 Firefox 中没有“inputType”,因此不会发生任何事情。

编辑我的解决方案
    @HostListener('keydown', ['$event'])
    @HostListener('input', ['$event'])
    onInput(e: any) {
        this.parseKeyDown(e);
    }

    parseKeyDown(e: any) {
        const key = e.key;
        if (key) { // Browsers WITH key events
...
        } else { // Browsers WITHOUT key events
            const data = e.data;
            const inputType = e.inputType;
...

最佳答案

@hostlistener您可以使用单个装饰器收听单个事件。如果要监听多个事件,可以添加多个 @hostlistener到单个功能,例如

@HostListener('click', ['$event'])
@HostListener('mouseover', ['$event'])
onEvent(event) {
    console.log(event)
}

如果不需要,您可以 Hook Angular 事件管理器插件并对其进行自定义。这是一个 article显示这个。

关于angular - 我可以使用多个@hoSTListener 或基于浏览器的事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55667627/

相关文章:

angular - 从 Angular 6 升级到 Angular 8 时出错

javascript - 未为使用 Firefox 的 Knockout 单击绑定(bind)定义事件参数

angular - RouteParams 和查询字符串

Angular 2 - typescript 中的 window.print 是什么

C# 处理事件

javascript - Angular ,element.bind 特定的 div

javascript - id 以自定义文本开头的所有按钮上的 JQuery 单击事件

javascript - 使用 JavaScript 的父节点上的委托(delegate)事件冒泡问题

javascript - 如何测试 Angular Material 对话框?

Angular 5 编译速度很慢,有时内存不足