当前位置: 首页 > 知识库问答 >
问题:

角点击防抖

徐子石
2023-03-14

在我的模板中,我有一个字段和两个按钮:

<div class="btn-plus" (click)="add(1)"> - </div>
<div class="txt"> {{ myValue }} </div>
<div class="btn-minus" (click)="add(-1)"> + </div>

在我的组件. ts文件中,我有:

add(num) {
    this.myValue +=num;
    this.update(); // async function which will send PUT request
}

这个。update()函数将myValue放入大JSON对象的适当字段中,并将其发送到服务器。

问题:当用户在短时间内点击10次加号/减号按钮时,将发送10次请求。但我只想发送一次请求-在上次单击后0.5秒。怎么做?

共有3个答案

万俟经纶
2023-03-14

一个辅助函数——

export const debounced = (cb, time) => {
  const db = new Subject();
  const sub = db.pipe(debounceTime(time)).subscribe(cb);
  const func = v => db.next(v);

  func.unsubscribe = () => sub.unsubscribe();

  return func;
};

那么一个示例使用可以是:

import { Component, OnInit } from '@angular/core';
import { debounced } from 'src/helpers';

@Component({
  selector: 'app-example',
  // Click calls `debouncedClick` instead of `myClick` directly
  template: '<button (click)="debouncedClick($event)">Click This</button>'
})
export class Example implements OnDestroy {
  debouncedClick; // Subject.next function

  constructor() {
    // Done in constructor or ngOnInit for `this` to resolve
    this.debouncedClick = debounced($event => this.myClick($event), 800);
  }

  // Called after debounced resolves (800ms from last call)
  myClick($event) {
    console.log($event);
  }

  ngOnDestroy() {
    // Stay clean!
    this.debouncedFunc.unsubscribe();
  }
}

还可以反转使用,在单击时调用“myClick”,并让取消公告回调执行所需的操作。经销商的选择。

就我个人而言,我也将此应用于(keyup)事件。

不确定是否真的需要取消订阅-实施起来比研究内存泄漏更快:)

从建明
2023-03-14

这是我在互联网上找到的部分答案,但我愿意找到更好的解决方案(或改进到下面的解决方案(指令)):

在互联网上,我找到了appDebounceClick指令,该指令在以下方面对我有所帮助:

我从中的添加中删除更新。ts文件

add(num) {
    this.myValue +=num;
}

并通过以下方式更改模板:

<div 
    appDebounceClick 
    (debounceClick)="update()" 
    (click)="add(1)" 
    class="btn-plus"
    > - 
</div>
<div class="txt"> {{ myValue }} </div>
<!-- similar for btn-minus -->

Cory Rylan编写的指令appDebounceClick(我在这里输入代码,以防链接将来停止工作):

import { Directive, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output } from '@angular/core';
import { Subject } from 'rxjs/Subject';
import { Subscription } from 'rxjs/Subscription';
import { debounceTime } from 'rxjs/operators';

@Directive({
  selector: '[appDebounceClick]'
})
export class DebounceClickDirective implements OnInit, OnDestroy {
  @Input() debounceTime = 500;
  @Output() debounceClick = new EventEmitter();
  private clicks = new Subject();
  private subscription: Subscription;

  constructor() { }

  ngOnInit() {
    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);
  }
}
薄哲
2023-03-14

使用goTutret运算符:

export class AppComponent  {
  name = 'Angular';

  calls = new Subject();

  service = {
    getData: () => of({ id: 1 }).pipe(delay(500)),
  };

  click() {
    this.calls.next(true);
    this.service.getData().pipe(
      takeUntil(this.calls),
    ).subscribe(res => console.log(res));
  }
}

Stackblitz(打开控制台查看日志)

 类似资料:
  • 问题内容: 当用户单击登录或注册按钮时,我试图阻止多个请求。这是我的代码,但是不起作用。只是第一次工作正常,然后返回false。 有任何想法吗?谢谢! 问题答案: 问题在这里: 不再指向按钮。

  • 问题内容: 在angular中,我们可以设置一个按钮来发送ajax请求,如下所示: 并在控制器中: 因此,为防止重复提交,我可以在单击按钮时将标志设置为buttonclicked = true,而在ajax回调完成时将其取消设置。但是,即使这样,控制权仍会归还给有角力的人,他们将更新Dom。这意味着有一个很小的窗口,在原始按钮单击完全100%完成之前,可以再次单击该按钮。 这是一个小窗口,但仍然可

  • 我在我的页面上有一组选项卡,当点击时,将活动选项卡切换到点击选项卡的值。这工作得很顺利,但是当我看到新的活动标签周围有一个蓝色的大焦点框时,我嘴里留下了一股酸味。有没有一种React-y方法来防止这种情况? 带有preventDefault()的onMouseDown={this.someMethod}是否可以工作?

  • Since 8.0 optionMenu 当调用setOptionMenu接口,自定义了导航栏右上角按钮以后,点击按钮时触发该事件 使用方法 document.addEventListener('optionMenu', function (e) { alert("option menu clicked"); }, false); 代码演示 基本功能演示 <h1>请点击右上角菜单查看效果</

  • 我有一个问题使我的图像可点击。它是一张推车风格的照片,带有一点数字气泡,告诉你在推车里有多少件物品。div是可点击的,但照片本身是不可点击的。 下面是我的代码: 我还尝试过用一个函数将click事件添加到图像中(“clicking”),我还尝试过将“routerlink='/cart'”添加到图像标记中,但这两种方法都不奏效。 我错过了什么? 提前谢谢!!

  • 我正在使用量角器在我的角度应用程序上运行E2E。我遇到了一个非常奇怪的问题。我正在使用Bootstrap Dropdown,它有一些选项。我需要单击其中一个选项。我参考了这个答案,它试图做类似的事情,但对我不起作用:量角器——如何选择大量嵌套的下拉元素? 我的结构看起来像: 在我的测试中,我尝试单击重命名链接。 我写的代码是: 在运行测试时,下拉切换按钮上有一个小的闪烁,似乎按钮被点击了。但是,应