我想从RxJS中的touch事件中重新创建contextmenu事件,因为iOS does not support是touch上的contextmenu事件.

用通俗易懂的语言,当出现以下情况时,应发出此可见光:

  • 发生touchstart事件
  • 2000ms(基本上为长压)
  • 接touchend

在以下情况下不应发出:

  • touch 端在2000毫秒内发生
  • touchstart事件之后是touchmove事件

如果touchend出现得更早,或者touchstart后面跟着touchmove,我不知道如何跳过.这就是我目前所做的:

const touchStart$ = fromEvent<TouchEvent>(this.el.nativeElement, "touchstart");
const touchEnd$ = fromEvent<TouchEvent>(this.el.nativeElement, "touchend");
const touchMove$ = fromEvent<TouchEvent>(this.el.nativeElement, "touchmove");
const contextmenu$ = touchStart$.pipe(
      switchMap(event => touchEnd$.pipe(mapTo(event))),
      switchMap(event => timer(2000).pipe(mapTo(event), takeUntil(merge(touchEnd$, touchMove$))))
);

contextmenu$.subscribe($event => {
      console.log("CONTEXTMENU EVENT HAPPENED");
});

推荐答案

您的解决方案可以简化一点.内部mapTo是不必要的,如果不重用名称event,可以在管道末端使用单个mapTo.此外,您可能希望在内部switchMap上使用take(1)而不是takeUntil(touchMove$),因为您希望在第一次emits 之后结束流:

  const longPress$ = this.touchStart$.pipe(
    switchMap(event => timer(2000).pipe(
      takeUntil(merge(touchMove$, touchEnd$)),
      switchMap(() => touchEnd$.pipe(take(1))),
      mapTo(event)
    ))
  );

我假设你得到了你想要的行为,但我认为通常情况下,当持续时间过go 时,longpress会开火;i、 我们不必等待touchend周年纪念活动.如果是这样的话,那就更简单了:

  const longPress$ = this.touchStart$.pipe(
    switchMap(event => timer(2000).pipe(
      takeUntil(merge(touchMove$, touchEnd$)),
      mapTo(event)
    ))
  );

这里有几个带有彩色日志(log)的堆栈闪电:Original | Simplified

Typescript相关问答推荐

Angular 17 -如何在for循环内创建一些加载?

有没有一种方法可以在保持类型的可选状态的同时更改类型?

类型{...}的TypeScript参数不能赋给类型为never的参数''

我用相同的Redux—Toolkit查询同时呈现两个不同的组件,但使用不同的参数

为什么从数组中删除一个值会删除打字错误?

使用打字Angular 中的通用数据创建状态管理

TypeScrip泛型类未提供预期的类型错误

使用TypeScrip5强制使用方法参数类型的实验方法修饰符

对象类型的TypeScrip隐式索引签名

类型推断对React.ForwardRef()的引用参数无效

当数组类型被扩展并提供标准数组时,TypeScrip不会抱怨

使用ngfor循环时,数据未绑定到表

如何在try 运行独立的文字脚本Angular 项目时修复Visual Studio中的MODULE_NOT_FOUND

如何在具有嵌套数组的接口中允许新属性

推断集合访问器类型

在TS泛型和记录类型映射方面有问题

我可以将一个类型数组映射到TypeScrip中的另一个类型数组吗?

两个子组件共享控制权

如何从列表中仅 Select 一种类型?

设置 --noImplicitAny 时,Typescript 编译器未标记返回 Any 的函数