angular - Rxjs, fromEvent 处理多个事件
问题描述
我正在尝试组合多个事件blur
并keyup (enter key only)
使用fromEvent
. 我已经实现了模糊事件,我也可以结合 keyup.enter 。
我已经尝试使用filter
操作员但使用过滤器,输入正在工作 onblur 不是 -
组件.ts
this.propertyDescription.forEach((input: ElementRef) => {
const events = ['blur', 'keyup'];
from(events)
.pipe(
takeUntil(this.unsubscribe$),
mergeMap((event) =>
fromEvent(input.nativeElement, event)
),
filter((e: KeyboardEvent) => e.key === 'Enter'),
map((evt: any) => evt.target.value),
distinctUntilChanged(
(pre: any, curr: any) =>
JSON.stringify(pre) === JSON.stringify(curr)
)
)
.subscribe((caption: string) => {
console.log(caption);
});
});
解决方案
a 内的订阅
forEach
是一个不雅的设计。它会导致多个(可能未处理的)订阅。你可以使用merge
withArray#map
。from
也可以使用merge
多个fromEvent
s而不是使用。
尝试以下
const events = ['blur', 'keyup'];
merge(
this.propertyDescription.map((input: ElementRef) =>
merge(
events.map((event: string) =>
fromEvent(input.nativeElement, event).pipe(
map((evt: any) => evt.target.value),
distinctUntilChanged((pre: any, curr: any) =>
JSON.stringify(pre) === JSON.stringify(curr)
)
)
)
)
)
).pipe(
takeUntil(this.unsubscribe$)
).subscribe((caption: string) => {
console.log(caption);
});
推荐阅读
- javascript - VueJS 反应性在刀片部分内不起作用
- sql-server - CTE 查找在无限循环中运行的顺序备份
- reactjs - 重新渲染后文本不出现
- angular6 - 角度 6 Router.navigate 右键单击不提供“在新选项卡中打开”选项
- vb.net - 如何根据运行程序的计算机在程序中使用本地或外部 IP 地址?
- java - 我可以使用哪个定位器通过 selenium 单击 span 元素
- php - 为什么我的 php pdo 语句在数据库中插入两次
- jquery - 如何通过单击使用 jquery 的复选框从包含具有特定文本的 div 的列表中过滤元素?
- mysql - 有没有更好的方法来编写我写的查询
- c - 如果用户给出“y”作为输入,C 程序需要继续循环