亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Angular中自定義Debounce Click指令防止重復點擊

2019-11-19 15:59:11
字體:
來源:轉載
供稿:網友

在這篇文章中,我們將介紹使用 Angular Directive API 來創建自定義 debounce click 指令。該指令將處理在指定時間內多次點擊事件,這有助于防止重復的操作。

對于我們的示例,我們希望在產生點擊事件時,實現去抖動處理。接下來我們將介紹 Directive API,HostListener API 和 RxJS 中 debounceTime 操作符的相關知識。首先,我們需要創建 DebounceClickDirective 指令并將其注冊到我們的 app.module.ts 文件中:

import { Directive, OnInit } from '@angular/core';@Directive({ selector: '[appDebounceClick]'})export class DebounceClickDirective implements OnInit { constructor() { } ngOnInit() { }}@NgModule({ imports: [BrowserModule], declarations: [  AppComponent,  DebounceClickDirective ], providers: [], bootstrap: [AppComponent]})export class AppModule { }

Angular 指令是沒有模板的組件,我們將使用以下方式應用上面的自定義指令:

<button appDebounceClick>Debounced Click</button>

在上面 HTML 代碼中的宿主元素是按鈕,接下來我們要做的第一件事就是監聽宿主元素的點擊事件,因此我們可以將以下代碼添加到我們的自定義指令中。

import { Directive, HostListener, OnInit } from '@angular/core';@Directive({ selector: '[appDebounceClick]'})export class DebounceClickDirective implements OnInit { constructor() { } ngOnInit() { } @HostListener('click', ['$event']) clickEvent(event: MouseEvent) {  event.preventDefault();  event.stopPropagation();  console.log('Click from Host Element!'); }}

在上面的例子中,我們使用了 Angular @HostListener 裝飾器,該裝飾器允許你輕松地監聽宿主元素上的事件。在我們的示例中,第一個參數是事件名。第二個參數 $event,這用于告訴 Angular 將點擊事件傳遞給我們的 clickEvent() 方法。

在事件處理函數中,我們可以調用 event.preventDefault()event.stopPropagation() 方法來阻止瀏覽器的默認行為和事件冒泡。

Debounce Events

現在我們可以攔截宿主元素的 click 事件,此時我們還需要有一種方法實現事件的去抖動處理,然后將它重新發送回父節點。這時我們需要借助事件發射器和 RxJS 中的 debounce 操作符。

import { Directive, EventEmitter, HostListener, OnInit, Output } from '@angular/core';import { Subject } from 'rxjs/Subject';import 'rxjs/add/operator/debounceTime';@Directive({  selector: '[appDebounceClick]'})export class DebounceClickDirective implements OnInit {  @Output() debounceClick = new EventEmitter();  private clicks = new Subject<any>();  constructor() { }  ngOnInit() {    this.clicks      .debounceTime(500)      .subscribe(e => this.debounceClick.emit(e));  }  @HostListener('click', ['$event'])  clickEvent(event: MouseEvent) {    event.preventDefault();    event.stopPropagation();    this.clicks.next(event);  }}

在上面的代碼中,我們使用 Angular @Output 屬性裝飾器和 EventEmitter 類,它們允許我們在指令上創建自定義事件。要發出事件,我們需要調用 EventEmitter 實例上的 emit() 方法。

但我們不想立即發出點擊事件,我們想做去抖動處理。為了實現這個功能,我們將使用 RxJS 中的 Subject 類。在我們的代碼中,我們創建一個主題來處理我們的點擊事件。在我們的方法中,我們調用 next() 方法來讓 Subject 對象發出下一個值。此外我們也使用 RxJS 中 debounceTime 的操作符,這允許我們通過設置給定的毫秒數來去抖動點擊事件。

一旦我們設置好了,我們現在可以在下面的模板中監聽我們的自定義去抖動點擊事件。

<button appDebounceClick (debounceClick)="log($event)"> Debounced Click</button>

現在,當我們點擊我們的按鈕時,它將延遲 500 毫秒。 500毫秒后,我們的自定義輸出屬性將會發出點擊事件?,F在我們有了基本的功能,我們需要做一些清理工作,并增加一些其它的功能。

Unsubscribe

對于 RxJS 中 Observables 和 Subject 對象,一旦我們不再使用它們,我們必須取消訂閱事件。如果我們沒有執行取消訂閱操作,有可能會出現內存泄漏。

import { Directive, EventEmitter, HostListener, OnInit, Output, OnDestroy } from '@angular/core';import { Subject } from 'rxjs/Subject';import { Subscription } from "rxjs/Subscription";import 'rxjs/add/operator/debounceTime';@Directive({  selector: '[appDebounceClick]'})export class DebounceClickDirective implements OnInit, OnDestroy {  @Output() debounceClick = new EventEmitter();  private clicks = new Subject<any>();  private subscription: Subscription;  constructor() { }  ngOnInit() {    this.subscription = this.clicks      .debounceTime(500)      .subscribe(e => this.debounceClick.emit(e));  }  ngOnDestroy() {    this.subscription.unsubscribe();  }  @HostListener('click', ['$event'])  clickEvent(event: MouseEvent) {    event.preventDefault();    event.stopPropagation();    this.clicks.next(event);  }}

要取消訂閱,我們需要保存訂閱時返回的訂閱對象。當 Angular 銷毀組件時,它將調用 OnDestroy 生命周期鉤子,因此我們可以在這個鉤子中,執行取消訂閱操作。

Custom Inputs

我們指令的功能已基本齊全,它可以正常處理事件。接下來,我們將添加一些更多的邏輯,以便我們可以自定義去抖動時間。為此,我們將使用 @Input 裝飾器。

import { Directive, EventEmitter, HostListener, OnInit, Output, OnDestroy, Input } from '@angular/core';import { Subject } from 'rxjs/Subject';import { Subscription } from "rxjs/Subscription";import 'rxjs/add/operator/debounceTime';@Directive({  selector: '[appDebounceClick]'})export class DebounceClickDirective implements OnInit, OnDestroy {  @Input() debounceTime = 500;  @Output() debounceClick = new EventEmitter();  private clicks = new Subject<any>();  private subscription: Subscription;  constructor() { }  ngOnInit() {    this.subscription = this.clicks      .debounceTime(this.debounceTime)      .subscribe(e => this.debounceClick.emit(e));  }  ngOnDestroy() {    this.subscription.unsubscribe();  }  @HostListener('click', ['$event'])  clickEvent(event: MouseEvent) {    event.preventDefault();    event.stopPropagation();    this.clicks.next(event);  }}

@Input 裝飾器允許我們將自定義延遲時間傳遞到我們的組件或指令中。在上面的代碼中,我們可以通過組件的輸入屬性,來指定我們希望去抖動的時間。默認情況下,我們將其設置為 500 毫秒。

<button appDebounceClick (debounceClick)="log($event)" [debounceTime]="300"> Debounced Click</button>

參考資源

creating-a-custom-debounce-click-directive-in-angular

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕久久| 欧美人与性动交a欧美精品| 亚洲欧美日韩中文视频| 欧美另类老肥妇| 国产精品亚洲第一区| 日韩欧美精品网站| 色偷偷88888欧美精品久久久| 国产偷国产偷亚洲清高网站| 亚洲激情视频在线播放| 亚洲综合国产精品| 欧美激情在线视频二区| 国产精品久久97| 美女国内精品自产拍在线播放| 久久久亚洲影院你懂的| 91豆花精品一区| 国产精品99免视看9| 国产日韩中文在线| 欧美激情一区二区久久久| xvideos国产精品| 黄网动漫久久久| 5566成人精品视频免费| 九九热视频这里只有精品| 欧美激情2020午夜免费观看| 欧美巨乳美女视频| 欧美成人自拍视频| 中文字幕日韩高清| 黄色精品在线看| 国产精品igao视频| 欧美日产国产成人免费图片| 欧美高清在线观看| 欧美自拍视频在线| 欧美午夜激情小视频| 中文字幕精品国产| 日韩欧美一区视频| 2019日本中文字幕| 中文字幕亚洲无线码在线一区| 欧美综合在线第二页| 亚洲第一福利视频| 91高清在线免费观看| 欧美黄色免费网站| 国产91在线视频| 亚洲精品国产综合区久久久久久久| 欧美在线视频免费| 欧美日韩激情视频| 国产91精品在线播放| 欧美成人一区二区三区电影| 国产日本欧美一区| 欧美在线一级va免费观看| 欧美片一区二区三区| 97视频在线观看播放| 一二美女精品欧洲| 欧美中文字幕在线播放| 亚洲欧美精品suv| 亚洲欧洲成视频免费观看| 国语自产精品视频在线看| 国产成人91久久精品| 久久国产精品久久精品| 在线观看国产精品日韩av| 欧美国产极速在线| 日韩少妇与小伙激情| 2019中文在线观看| **欧美日韩vr在线| 亚洲精品福利在线| 欧美日韩xxx| 国产精品美女在线观看| 国产精品xxxxx| 日韩精品亚洲精品| 亚洲成av人片在线观看香蕉| 欧美激情xxxx性bbbb| 国产精品99久久久久久白浆小说| 成人午夜在线影院| 国产精品丝袜久久久久久不卡| 欧美性生活大片免费观看网址| 亚洲日本aⅴ片在线观看香蕉| 久久久久国产精品免费| 91最新国产视频| 国产精品日韩电影| 97视频在线观看视频免费视频| 欧美成人三级视频网站| 尤物九九久久国产精品的分类| 国产精品扒开腿做爽爽爽的视频| 日韩美女中文字幕| 乱亲女秽乱长久久久| 欧美野外wwwxxx| 久久久久久久成人| 曰本色欧美视频在线| 欧美老女人在线视频| 国产成人福利网站| 国产亚洲欧美日韩美女| 亚洲精品久久久久久久久久久久| 日本高清不卡在线| 日韩国产在线看| 国产亚洲美女精品久久久| 亚洲精品国产精品乱码不99按摩| 日韩风俗一区 二区| 国产精品久久久久久av| 国产精品久久久久久一区二区| 精品久久香蕉国产线看观看gif| 少妇久久久久久| 成人h视频在线| 亚洲片av在线| 亚洲日韩中文字幕| 久久在精品线影院精品国产| 亚洲激情国产精品| 国产精品av在线| 亚洲男子天堂网| 欧美极度另类性三渗透| 久久精品精品电影网| 国产主播在线一区| 韩日欧美一区二区| 中文.日本.精品| 国产a∨精品一区二区三区不卡| 欧美日韩另类在线| 中文字幕在线亚洲| 青青草原成人在线视频| 91久久久久久国产精品| 亚洲免费高清视频| 欧美专区福利在线| 欧美亚洲国产日本| 国产精品海角社区在线观看| 久久久久久亚洲| 国产欧美韩国高清| 亚洲aaaaaa| 日韩欧美亚洲范冰冰与中字| 欧美激情一区二区三区高清视频| 俺去亚洲欧洲欧美日韩| 黑人巨大精品欧美一区免费视频| 亚洲另类激情图| 国产精品久久久久久亚洲调教| 欧美成人午夜激情| 亚洲欧美日韩天堂| 国产免费一区二区三区在线观看| 国产精品爱久久久久久久| 日本精品中文字幕| 日韩av综合网| 亚洲人高潮女人毛茸茸| 国产精品极品尤物在线观看| 久热精品在线视频| 久久综合久中文字幕青草| 久久久999精品免费| 8x海外华人永久免费日韩内陆视频| 美女精品久久久| 精品国产乱码久久久久久虫虫漫画| 黄色91在线观看| 国产精品黄色影片导航在线观看| 成人激情电影一区二区| 亚洲精品乱码久久久久久金桔影视| 日本精品久久电影| 日本一区二区在线免费播放| 亚洲国产精品成人一区二区| www国产精品com| 国产精品高潮呻吟久久av黑人| 欧美又大又硬又粗bbbbb| 久久五月天综合| 中文字幕亚洲一区二区三区| 成人免费网站在线看| 亚洲天堂成人在线| 91精品国产成人| 日韩国产中文字幕| 91地址最新发布| 欧美体内谢she精2性欧美| 久久男人资源视频| 欧美在线视频一区| 国产在线观看不卡|