Stream 如何制作键盘事件流';长按该键时触发的?(飞镖)

Stream 如何制作键盘事件流';长按该键时触发的?(飞镖),stream,dart,angular,Stream,Dart,Angular,我如何创建键盘事件流,当长按某个html元素中的键时会触发该事件流 同样,我也对Angular2指令(longpress)(具有相同的想法)感兴趣 事件处理(preventDefault)似乎还不能正常工作。 将此指令添加到会中断输入中的写入 一种解决方法是以这种方式订阅keydown/keydup LongPress(ElementRef elementRef) { (elementRef.nativeElement as Element).onKeyDown.listen(keyEven

我如何创建键盘事件流,当长按某个html元素中的键时会触发该事件流

同样,我也对Angular2指令
(longpress)
(具有相同的想法)感兴趣

事件处理(
preventDefault
)似乎还不能正常工作。 将此指令添加到
会中断输入中的写入

一种解决方法是以这种方式订阅keydown/keydup

LongPress(ElementRef elementRef) {
  (elementRef.nativeElement as Element).onKeyDown.listen(keyEventHandler);
  (elementRef.nativeElement as Element).onKeyUp.listen(keyEventHandler);
}

以下是typescript版本,如果有人感兴趣:

import { Directive, EventEmitter, Output, Input, HostListener } from '@angular/core';

    @Directive({
        selector: '[longpress]'
    })
    export class LongPressDirective {

      @Output() longpress: EventEmitter<KeyboardEvent> = new EventEmitter(true);

      _startEvent: KeyboardEvent;
      @Input() longpressDelay: number = 1000;

      timer: any;

      @HostListener('keydown', ['$event'])
      @HostListener('keyup', ['$event'])
      keyEventHandler(event: KeyboardEvent) {
        if (this._startEvent == null ||
          this._startEvent.type != event.type ||
          this._startEvent.keyCode != event.keyCode) {

          //console.log(event.type, event);
          if (this.timer != null) {
            clearTimeout(this.timer);
          }

          this._startEvent = event;

          if(event.type == 'keydown') {
            this.timer = setTimeout(() => {
              console.log('longpress');
              this.longpress.emit(this._startEvent);
              clearTimeout(this.timer);
              this.timer = null;
            }, this.longpressDelay);
          }
        }
      }
    }
import{Directive,EventEmitter,Output,Input,HostListener}来自“@angular/core”;
@指示({
选择器:“[longpress]”
})
导出类longpress指令{
@Output()longpress:EventEmitter=neweventemitter(true);
_StarteEvent:键盘事件;
@输入()长按延时:数字=1000;
定时器:任意;
@HostListener('keydown',['$event']))
@HostListener('keyup',['$event']))
keyEventHandler(事件:KeyboardEvent){
如果(this.\u startEvent==null||
此.\u startEvent.type!=event.type||
这是。_startEvent.keyCode!=事件.keyCode){
//console.log(event.type,event);
如果(this.timer!=null){
clearTimeout(this.timer);
}
此。_startEvent=事件;
如果(event.type=='keydown'){
this.timer=setTimeout(()=>{
console.log('longpress');
this.longpress.emit(this.\u startEvent);
clearTimeout(this.timer);
this.timer=null;
},此为长按延迟);
}
}
}
}

这是我代码中的一个错误。我漏掉了一张支票,如果您使用
()=>
就不需要
,非常感谢您的帮助:)
<label for="input">Longpress: </label><input id="longpress" (longpress)="longPressed($event)">
LongPress(ElementRef elementRef) {
  (elementRef.nativeElement as Element).onKeyDown.listen(keyEventHandler);
  (elementRef.nativeElement as Element).onKeyUp.listen(keyEventHandler);
}
import { Directive, EventEmitter, Output, Input, HostListener } from '@angular/core';

    @Directive({
        selector: '[longpress]'
    })
    export class LongPressDirective {

      @Output() longpress: EventEmitter<KeyboardEvent> = new EventEmitter(true);

      _startEvent: KeyboardEvent;
      @Input() longpressDelay: number = 1000;

      timer: any;

      @HostListener('keydown', ['$event'])
      @HostListener('keyup', ['$event'])
      keyEventHandler(event: KeyboardEvent) {
        if (this._startEvent == null ||
          this._startEvent.type != event.type ||
          this._startEvent.keyCode != event.keyCode) {

          //console.log(event.type, event);
          if (this.timer != null) {
            clearTimeout(this.timer);
          }

          this._startEvent = event;

          if(event.type == 'keydown') {
            this.timer = setTimeout(() => {
              console.log('longpress');
              this.longpress.emit(this._startEvent);
              clearTimeout(this.timer);
              this.timer = null;
            }, this.longpressDelay);
          }
        }
      }
    }