stream - 如何制作长按按键时触发的KeyboardEvent流? ( Dart )

标签 stream dart angular

长按某些html元素中的键时,如何触发触发的KeyBoardEvent流。

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

最佳答案

@Directive(
    selector: '[longpress]')
class LongPress {
  @Output() EventEmitter<KeyboardEvent> longpress =
      new EventEmitter<KeyboardEvent>();

  KeyboardEvent _startEvent;
  @Input() Duration longpressDelay = new Duration(seconds: 2);
  Timer timer;

  @HostListener("keydown", const [r"$event"])
  @HostListener("keyup", const [r"$event"])
  void keyEventHandler(KeyboardEvent event) {
    if (_startEvent == null ||
        _startEvent.type != event.type ||
        _startEvent.keyCode != event.keyCode) {
      if (timer != null) {
        timer.cancel();
      }
      _startEvent = event;

      if(event.type == 'keyup') {
        timer = new Timer(longpressDelay, () {
          longpress.add(_startEvent);
          timer = null;
        });
      }
    }
  }
}

并像这样使用
<label for="input">Longpress: </label><input id="longpress" longpress (longpress)="longPressed($event)">

我还没有想办法使指令选择器与(...)一起使用,所以它也可以正常工作:
<label for="input">Longpress: </label><input id="longpress" (longpress)="longPressed($event)">

事件处理(preventDefault)似乎无法正常工作。
将此指令添加到<input>会中断输入的编写。

解决方法是改用这种方式订阅keydown / keyup
LongPress(ElementRef elementRef) {
  (elementRef.nativeElement as Element).onKeyDown.listen(keyEventHandler);
  (elementRef.nativeElement as Element).onKeyUp.listen(keyEventHandler);
}

关于stream - 如何制作长按按键时触发的KeyboardEvent流? ( Dart ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34715315/

相关文章:

javascript - 在 Angular 2 typescript 中获取模态元素

java - gRPC 如何在客户端等待来自 StreamingServer 的 header

firebase - 如何使用 firebase auth 在 flutter 中添加用户个人资料图片

angular - 如何在 openseadragon 中显示原始图像大小?

dart - String.replaceAllMapped 具有异步结果

opengl - 如何使用 WebGL 渲染 2D Sprite?

javascript - Angular 2 - 应该是 routerLink ="theRoute"还是 [routerLink] ="[' 路由']”?

c++ - boost/输出到文件

c# - 我可以不通过内存直接从 HttpResponseMessage 流式传输到文件吗?

java - 将 Akka 流传递给上游服务以进行填充