在angular4中触发键盘事件(回车键)

在我的应用程序中,我有一个全局搜索字段,用于过滤列表中的数据,列表将有多个列。从其他组件设置过滤器值(设置为输入值)它正在发生,但我必须触发输入上的手动键盘事件(输入键)操作。

我尝试使用 viewChild 装饰器。

组件.html

<input #gb type="text" placeholder="Global search.." class="changeListComponent_inputSearch"  [(ngModel)]="jiraRef" />

组件.ts

@ViewChild('gb') gb:ElementRef;         
this.jiraRef =  jiraRef;
const event = new KeyboardEvent("keypress",{ "which ": "13"});
this.gb.nativeElement.focus();
this.gb.nativeElement.dispatchEvent(event);

使用它我可以设置值并获得焦点,但键盘事件没有触发。

stack overflow Trigger the keyboard event (enter key) in angular4
原文答案

答案:

作者头像

你可以简单地使用

<input type=text (keypress)="eventHandler($event)">

eventHandler(event) {
   console.log(event, event.keyCode, event.keyIdentifier);
} 

解决方案基于此答案 Get which key pressed from (keypress) angular2

作者头像

使用本机 js 代码触发按键事件。
将 id 属性与元素引用一起放置到输入元素中。

从我的组件内部创建新功能。

triggerEvent(el, type) {
    if ('createEvent' in document) {
        var e = document.createEvent('HTMLEvents');
        e.initEvent(type, false, true);
        el.dispatchEvent(e);
    } else {
        var e = document.createEventObject();
        e.eventType = type;
        el.fireEvent('on'+e.eventType, e);
    }
}

var el=document.getElementById('gb-search');
this.triggerEvent(el,'keyup');
作者头像

我不确定你为什么让它变得复杂。为什么不直接将按键事件添加到输入字段,然后也可以通过 viewChild 触发该事件?

<input id="text1" type=text (keyup)="enterPressed()">

然后还可以通过视图子访问相同的方法:

this.viewChild.enterPressed();
作者头像

一般来说,您的输入可以是:

<input (keydown.enter)="doEnter()">

从其他组件只需调用函数 doEnter 。如何?

如果搜索组件在父组件中,这很容易,因为您可以使用 ViewChild

 <search-component></search-component>
 @ViewChild(SearchComponent) searchComponent
 ..whe we need..
 this.searchComponent.doEnter()

否则,通常使用 Subject 来订阅。你有服务,

@Injectable({
  providedIn: 'root',
})
export class KeyBoardService {
  keyboard:Subject<any>=new Subject<any>()
  constructor() { }

}

在您的组件搜索中,在构造函数和 ngOnInit 中注入服务

constructor(private keyboardService:KeyBoardService){}
ngOnInit(){
    this.keyboardService.keyboard.subscribe(_=>{
         this.doEnter()
    })
}

在另一个组件中

constructor(private keyboardService:KeyBoardService){}
..in anywhere..
this.keyboardService.next(null);

存在另一个选项,即当两个组件同时出现在屏幕中时 - 并且在使用模板引用变量和输入的同一个 <router-outlet></router-outlet> 中。所以我们有

<search-component #search></search-component>
<other-component [search]=search><other-component>

在其他组件中

@Input('search') searchComponent
..in anywhere
this.searchComponent.doEnter