How to prevent double click in Angular?

前端 未结 5 1795
南旧
南旧 2020-12-24 02:49

I have a component with click.


When I click this element, openModa

5条回答
  •  梦毁少年i
    2020-12-24 03:52

    Since some people asked for the throttleTime directive, I'll add it below. I chose to go this route because the debounceTime waits for the last click before firing the actual click event. throttleTime will not allow the clicker to click the button again until that time is reached and instead fires the click event immediately.

    Directive

    import { Directive, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output } from '@angular/core';
    import { Subject, Subscription } from 'rxjs';
    import { throttleTime } from 'rxjs/operators';
    
    @Directive({
      selector: '[appPreventDoubleClick]'
    })
    export class PreventDoubleClickDirective implements OnInit, OnDestroy {
      @Input()
      throttleTime = 500;
    
      @Output()
      throttledClick = new EventEmitter();
    
      private clicks = new Subject();
      private subscription: Subscription;
    
      constructor() { }
    
      ngOnInit() {
        this.subscription = this.clicks.pipe(
          throttleTime(this.throttleTime)
        ).subscribe(e => this.emitThrottledClick(e));
      }
    
      emitThrottledClick(e) {
        this.throttledClick.emit(e);
      }
    
      ngOnDestroy() {
        this.subscription.unsubscribe();
      }
    
      @HostListener('click', ['$event'])
      clickEvent(event) {
        event.preventDefault();
        event.stopPropagation();
        this.clicks.next(event);
      }
    }
    

    Example Usage

    throttleTime is optional since there is a default of 500 in the directive

    
    

    If you have a bot that's clicking on your element every 1ms, then you'll notice that the event only ever fires once until the throttleTime is up.

提交回复
热议问题