在我的模板中,我有一个字段和两个按钮:
<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秒。怎么做?
一个辅助函数——
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)
事件。
不确定是否真的需要取消订阅-实施起来比研究内存泄漏更快:)
这是我在互联网上找到的部分答案,但我愿意找到更好的解决方案(或改进到下面的解决方案(指令)):
在互联网上,我找到了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);
}
}
使用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,它有一些选项。我需要单击其中一个选项。我参考了这个答案,它试图做类似的事情,但对我不起作用:量角器——如何选择大量嵌套的下拉元素? 我的结构看起来像: 在我的测试中,我尝试单击重命名链接。 我写的代码是: 在运行测试时,下拉切换按钮上有一个小的闪烁,似乎按钮被点击了。但是,应