在angular4

时间:2017-11-15 04:44:00

标签: javascript angular

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

我尝试使用viewChild装饰器。

  

component.html

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

component.ts

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

使用这个我可以设置值并进行焦点但键盘事件不会触发。

4 个答案:

答案 0 :(得分:0)

使用原生js代码触发了键启动事件 将id属性与元素引用一起放在input元素中。

  

从我的组件内部创建新函数。

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');

答案 1 :(得分:0)

我不知道你为什么要把它弄复杂。为什么不直接在 input 字段中添加一个按键事件,然后也可以通过 viewChild 触发该事件?

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

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

this.viewChild.enterPressed();

答案 2 :(得分:0)

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

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

从其他组件只需调用函数 doEnter。怎么样?

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

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

否则,通常使用主题来订阅。您有一项服务,

@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

答案 3 :(得分:-2)

您只需使用

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

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

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