Rxjs 触发时序相关的困惑

发布于 2022-09-11 18:07:56 字数 1835 浏览 13 评论 0

需求是实现一个自定义控件,如下图所示的样子
clipboard.png

需要实现在Input中,焦点离开或者点击F9,或者点击按钮的时候,弹出窗口,且只弹出一次。
实际做成时,焦点离开和点击F9并不能很好的区分。

使用的版本是"rxjs": "6.2.2"

import { fromEvent } from 'rxjs';
import { throttleTime, first, merge, timestamp } from 'rxjs/operators';

ngAfterViewInit(): void {

if (document.getElementById(this.id)) {
  const inputBlur = fromEvent(this.render.selectRootElement("#" + this.id), 'blur');
  const inputF9 = fromEvent(this.render.selectRootElement("#" + this.id), 'keydown');
  const btnClick = fromEvent(document.getElementById(this.buttonId), 'click');
  this.lovEvent = inputBlur.pipe(merge(inputF9)).pipe(merge(btnClick)).pipe(throttleTime(3000)).pipe(first());
  this.subScribe();
}

}
subScribe() {

if (document.getElementById(this.id)) {
  this.lovEvent.subscribe(
    (val: any) => {
      switch (val.type) {
        case `keydown`:
          if (val.code === 'F9') {
            console.log('F9')
            console.log(val.timeStamp)
            this.showModel()
          }
          break;
        case `click`:
          console.log('click')
          console.log(val.timeStamp)
          this.showModel();
          break;
        case `blur`:
          console.log('blur')
          console.log(val.timeStamp)
          this.blurFunc();
          break;
      }
    }
  );
}

}

HTML部分
<input type="text" [id]="id" [(ngModel)]="bindval"(blur)="subScribe()" (keydown)="subScribe()" >
<button type="value" id="{{buttonId}}" (click)="subScribe()">...</button>

因为有可能在输入的过程中点击F9,弹出了model,从而触发了焦点离开。
所以在加入了throttleTime(3000)和first()方法,想要只想使用单位时间内的第一个触发的事件。
但是在使用过程中发现,并没有如预期那样实现,也就是说F9的点击,和焦点离开都在三秒内触发了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文