全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Angular中自定义Debounce Click指令防止重复点击

在这篇文章中,我们将介绍使用 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毫秒后,我们的自定义输出属性将会发出点击事件。现在我们有了基本的功能,我们需要做一些清理工作,并增加一些其它的功能。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Angular  # 自定义Debounce  # Click  # Debounce  # Angularjs的$http异步删除数据详解及实例  # Angularjs的键盘事件的绑定  # Angularjs 事件指令详细整理  # angular中实现li或者某个元素点击变色的两种方法  # AngularJS点击添加样式、点击变色设置的实例代码  # Angular通过angular-cli来搭建web前端项目的方法  # 详解angularjs获取元素以及angular.element()用法  # Angular指令之restict匹配模式的详解  # 自定义  # 我们可以  # 在上面  # 它将  # 在我们的  # 方法来  # 好了  # 在这个  # 第一个  # 将会  # 在这  # 有一种  # 给我们  # 将其  # 时间内  # 要做  # 第二个  # 还需要  # 它可以  # 我们现在 


相关文章: 建站主机数据库如何配置才能提升网站性能?  Python文件管理规范_工程实践说明【指导】  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  ,想在网上投简历,哪几个网站比较好?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  如何在IIS中新建站点并配置端口与物理路径?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何规划企业建站流程的关键步骤?  智能起名网站制作软件有哪些,制作logo的软件?  代购小票制作网站有哪些,购物小票的简要说明?  大型企业网站制作流程,做网站需要注册公司吗?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  网站app免费制作软件,能免费看各大网站视频的手机app?  如何做网站制作流程,*游戏网站怎么搭建?  重庆市网站制作公司,重庆招聘网站哪个好?  建站168自助建站系统:快速模板定制与SEO优化指南  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  网站制作价目表怎么做,珍爱网婚介费用多少?  制作农业网站的软件,比较好的农业网站推荐一下?  如何在景安云服务器上绑定域名并配置虚拟主机?  如何在建站宝盒中设置产品搜索功能?  css网站制作参考文献有哪些,易聊怎么注册?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  网站制作需要会哪些技术,建立一个网站要花费多少?  如何配置支付宝与微信支付功能?  网站制作说明怎么写,简述网页设计的流程并说明原因?  宝塔建站后网页无法访问如何解决?  如何快速搭建响应式可视化网站?  上海网站制作开发公司,上海买房比较好的网站有哪些?  如何快速重置建站主机并恢复默认配置?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何有效防御Web建站篡改攻击?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何通过老薛主机一键快速建站?  如何选择高效稳定的ISP建站解决方案?  三星网站视频制作教程下载,三星w23网页如何全屏?  建站之星代理费用多少?最新价格详情介绍  移民网站制作流程,怎么看加拿大移民官网?  广东企业建站网站优化与SEO营销核心策略指南  如何通过FTP空间快速搭建安全高效网站?  电商网站制作价格怎么算,网上拍卖流程以及规则?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何获取免费开源的自助建站系统源码?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何在建站之星绑定自定义域名?  网站制作话术技巧,网站推广做的好怎么话术? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。