angular12自定义指令防止2重点击

方法一

import { Directive, ElementRef, HostListener } from '@angular/core';

@Directive({
  selector: '[appPreventDoubleClick]'
})
export class PreventDoubleClickDirective {
  private isClicked: boolean = false;

  constructor(private elementRef: ElementRef) {}

  @HostListener('click', ['$event'])
  onClick(event: MouseEvent) {
    if (this.isClicked) {
      event.preventDefault();
      event.stopPropagation();
    } else {
      this.isClicked = true;
      setTimeout(() => {
        this.isClicked = false;
      }, 1000); // 设置一个合适的时间间隔,比如1秒
    }
  }
}

方法二

@Directive({
  selector: '[preventDoubleClick]'
})
export class PreventDoubleClickDirective {
  private canClick = true;

  constructor(private elementRef: ElementRef) {}

  @HostListener('click')
  onClick() {
    if (this.canClick) {
      this.canClick = false;
      // 执行点击事件的逻辑
      // 例如发送请求等
      // ...

      setTimeout(() => {
        this.canClick = true;
      }, 1000); // 设置一个延迟时间,在延迟时间内不可点击
    }
  }
}

方法三

使用 debounceTime 可以防止按钮的重复点击。debounceTime 会等待一段时间,只有在该时间内没有新的事件发生时,才会将事件传递给订阅者。这样就可以防止按钮的连续点击。

下面是一个示例代码:

import { fromEvent } from 'rxjs';
import { debounceTime } from 'rxjs/operators';

const button = document.getElementById('myButton');

// 创建一个 Observable,监听按钮的点击事件
const click$ = fromEvent(button, 'click');

// 使用 debounceTime(1000) 来防止按钮的连续点击
click$.pipe(
  debounceTime(1000)
).subscribe(() => {
  console.log('Button clicked');
});

在上面的代码中,debounceTime(1000) 表示等待 1000 毫秒,如果在这段时间内没有新的点击事件发生,才会将点击事件传递给订阅者。这样就可以防止按钮的重复点击。

你可以根据需要调整 debounceTime 的时间间隔来适应不同的场景。

$ 并不是特定的语法,而是一个命名约定。在 RxJS 中,通常将 Observable 对象的变量名以 $ 结尾,以表示该变量是一个 Observable 对象。这是一种命名约定,用于提醒开发人员该变量是一个 Observable 对象,可以通过订阅来监听其发出的事件。

方法四

以下是使用RxJS编写的防止2次点击的自定义指令示例:

import { Directive, ElementRef, HostListener } from '@angular/core';
import { fromEvent, Subject } from 'rxjs';
import { debounceTime, takeUntil } from 'rxjs/operators';

@Directive({
  selector: '[preventDoubleClick]'
})
export class PreventDoubleClickDirective {
  private destroy$ = new Subject();

  constructor(private elementRef: ElementRef) {}

  @HostListener('click', ['$event'])
  onClick(event: MouseEvent) {
    event.stopPropagation();
    event.preventDefault();

    fromEvent(this.elementRef.nativeElement, 'click')
      .pipe(
        debounceTime(300), // 设置防抖时间
        takeUntil(this.destroy$)
      )
      .subscribe(() => {
        // 执行点击事件的逻辑
        console.log('Clicked');
      });

    this.destroy$.next(); // 销毁上一次的点击事件
  }
}

在上述示例中,我们定义了一个名为preventDoubleClick的自定义指令。该指令会防止连续2次点击事件的触发。

debounceTime 的时间单位是毫秒(ms)

我们使用fromEvent方法来创建一个可观察对象,监听指定元素的click事件。然后,我们使用debounceTime操作符来设置防抖时间,即在两次点击之间必须等待一定的时间间隔。最后,我们使用takeUntil操作符来在下一次点击事件到来时取消订阅上一次的点击事件。

onClick方法中,我们首先阻止默认的点击事件行为和事件冒泡。然后,我们订阅可观察对象,执行点击事件的逻辑。最后,我们通过this.destroy$.next()来销毁上一次的点击事件的订阅。

要使用该自定义指令,只需要将其添加到需要防止2次点击的元素上,例如:

<button preventDoubleClick>Click me</button>

这样,当用户连续点击按钮时,只有在一定时间间隔内的第一次点击事件会触发。

  1. fromEventfromEvent 是 RxJS 中的一个操作符,用于从 DOM 事件、Node.js 事件或其他事件源中创建一个 Observable。它接收两个参数:事件源和事件名称。例如,可以使用 fromEvent(document, 'click') 来创建一个 Observable,它会在每次点击文档时发出一个值。

  2. .pipe.pipe 是 RxJS 中的一个方法,用于将多个操作符链接在一起,形成一个操作符链。它接收一个或多个操作符作为参数,并返回一个新的 Observable。通过使用 .pipe,可以按照特定的顺序应用多个操作符。

  3. takeUntiltakeUntil 是一个操作符,它接收一个 Observable 作为参数,并且会在这个参数 Observable 发出第一个值时,终止源 Observable。例如,可以使用 takeUntil(stopObservable) 来在 stopObservable 发出值时停止源 Observable 的发出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Angular 中,你可以通过自定义指令来扩展 HTML 元素的行为和功能。下面是自定义指令的基本步骤: 1. 创建指令类: - 创建一个新的类,用于定义你的指令。 - 使用 `@Directive` 装饰器来标记该类为一个指令,并传入一个配置对象。 下面是一个示例: ```typescript import { Directive, ElementRef } from '@angular/core'; @Directive({ selector: '[appCustomDirective]' }) export class CustomDirective { constructor(private elementRef: ElementRef) { this.elementRef.nativeElement.style.backgroundColor = 'yellow'; } } ``` 在上面的示例中,我们创建了一个名为 `CustomDirective` 的指令类,并使用 `@Directive` 装饰器来标记它为一个指令。`selector` 属性指定了该指令在模板中的使用方式,这里使用的是属性选择器 `[appCustomDirective]`。 2. 在模板中应用指令: - 在需要应用指令的元素上使用指令的选择器,可以是属性选择器、类选择器或标签选择器。 下面是一个示例: ```html <div appCustomDirective>Custom Directive Example</div> ``` 在上面的示例中,我们使用 `[appCustomDirective]` 属性选择器将自定义指令应用到了 `<div>` 元素上。 3. 使用指令提供的功能: - 在指令类中可以定义各种功能,如修改元素样式、监听事件、操作 DOM 等。 - 在构造函数中可以注入依赖,如 `ElementRef` 用于操作元素。 在上面的示例中,我们在指令类的构造函数中注入了 `ElementRef`,使用它来获取指令所应用的元素,并修改其背景颜色为黄色。 通过以上步骤,你就可以创建和使用自定义指令了。可以根据需求在指令类中实现各种功能,并在模板中应用指令来扩展元素的行为和功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值