監聽click事件,
默認三秒鍾內的點擊事件觸發第一次的點擊事件,也可以通過throttleTime自定義時間 只觸發第一次
/**
* <div (throttleClick)="goExceptionReport()" [throttleTime]="5000">throttleClick 5 S</div>
* <div (throttleClick)="goExceptionReport()">throttleClick default</div>
* <div tappable (throttleClick)="goExceptionReport()">throttleClick default with tappable</div>
*/
import { Directive, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output } from "@angular/core";
import { Subject } from "rxjs/Subject";
import { Subscription } from "rxjs/Subscription";
@Directive( {
selector: "[throttleClick]",
} )
export class ThrottleClickDirective implements OnInit, OnDestroy {
@Input() public throttleTime = 3000;
@Output() public throttleClick = new EventEmitter();
private clicks = new Subject<any>();
private subscription: Subscription;
constructor() {}
ngOnInit() {
// 攔截點擊事件只傳遞第一次點擊事件的處理操作交給parent來處理
this.subscription = this.clicks
.throttleTime( this.throttleTime )
.subscribe(( e ) => this.throttleClick.emit( e ) );
}
ngOnDestroy() {
// 取消訂閱
this.subscription.unsubscribe();
}
// HostListener這個裝飾器可以監聽directive作用的dom元素的click事件,第二個參數$event告訴Angular傳遞點擊事件到directive中去;
@HostListener( "click", [ "$event" ] )
clickEvent( event: MouseEvent ) {
// 防止事件繼續向parent component中傳遞
event.preventDefault();
event.stopPropagation();
// 這里使用subject的.next來傳遞點擊事件,然后使用rxjs的函數操作符throttleTime來處理延時事件,在指定事件內只處理第一次操作,調用emit傳遞點擊事件的操作到parent中去繼續處理;
this.clicks.next( event );
}
}
默認三秒鍾內的點擊事件觸發最后一次的點擊事件,也可以通過debounceTime自定義時間 只觸發最后一次
import { Directive, EventEmitter, HostListener, OnInit, Output, Input } from '@angular/core';
import { Subject } from 'rxjs/Subject';
import { debounceTime } from 'rxjs/operators';
import {Subscription} from 'rxjs/Subscription';
@Directive({
selector: '[appDebounceClick]'
})
export class DebounceClickDirective implements OnInit {
@Input() debounceTime = 500;
@Output() debounceClick = new EventEmitter();
private clicks = new Subject();
private subscription: Subscription;
constructor() { }
ngOnInit() {
// 攔截點擊事件然后延遲這些點擊事件的執行,直到一段時間內最后一次點擊,最后把事件的處理操作交給parent來處理
this.subscription = this.clicks.pipe(
debounceTime(this.debounceTime)
).subscribe(e => this.debounceClick.emit(e));
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
@HostListener('click', ['$event'])
clickEvent(event) {
event.preventDefault();
event.stopPropagation();
this.clicks.next(event);
}
}