Rxjs 触发时序相关的困惑
需求是实现一个自定义控件,如下图所示的样子
需要实现在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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论