angular - Button Debounce 提交表单
问题描述
创建一个 Debounce 指令,我最终会限制点击事件,或者您面临的问题是我的按钮之前有发送事件......例如:
<button class="btn btn-light btn-block" type="submit" [hidden]="formCadastrohabilitado">
<i class="material-icons center align-middle ">
fast_forward
</i> INICIAR
</button>
他的指令是这样的:
<button passeDebounceClick (debounceClick)="" [debounceTime]="500" class="btn btn-light btn-block" [hidden]="formCadastrohabilitado">
<i class="material-icons center align-middle ">
fast_forward
</i> INICIAR
</button>
debounce-click-directive.directive.ts:
import {Directive, HostListener, OnInit, Output, EventEmitter, Input} from '@angular/core';
import {Subject, Subscription} from 'rxjs';
import {debounceTime} from 'rxjs/operators';
@Directive({
selector: '[passeDebounceClick]'
})
export class DebounceClickDirectiveDirective implements OnInit {
@Output() debounceClick = new EventEmitter();
@Input() debounceTime = 500;
private clicks = new Subject();
private subscription: Subscription;
constructor() {
}
ngOnInit() {
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);
}
}
我只想提交一个表单,但使用 Debounce 不要双击
解决方案
debounceTime
如果源 observable 在给定的持续时间内没有发出另一个值,您将不会使用 debounceTime 触发器阻止多次点击。您想要实现的目标可以使用排气映射操作符来完成。
您可以为按钮添加模板引用:
<button #submitButton class="btn btn-light btn-block" type="submit" [hidden]="formCadastrohabilitado">
<i class="material-icons center align-middle ">
fast_forward
</i>
INICIAR
</button>
然后在你的 component.ts 中:
@ViewChild('submitButton', {read: ElementRef, static: true}) button: ElementRef;
ngOnInit(): void {
fromEvent(this.button.nativeElement, 'click').pipe(exhaustMap((event: MouseEvent) => this.YourService.submitForm(yourData)));
}
Whilethis.YourService.submitForm(yourData)
是您的服务发布方法来提交表单数据。在完成exhaustMap
之前,操作员将忽略并且不会保存来自可观察源的任何排放this.YourService.submitForm(yourData)
。
推荐阅读
- python - 应用于熊猫数据框列的函数中缺少
- java - Java模块化项目中如何正确组织接口和实现?
- google-sheets - 谷歌表格计算和组合数据所需的公式
- javascript - 如何在没有chrome打印对话框的情况下直接打印HTML页面?
- matlab - 使用 regionprop 的 MaxFeretDiameter 值 - Matlab
- azure - Azure Function App 中用于身份验证的主机密钥
- combinations - 返回 SQL 中单个列的所有可能的值对组合
- flutter - 如何在 Flutter 中的屏幕转换期间保留用户的选择
- python - 如何在python中计算几何平均值并忽略0
- javascript - 当两个元素同时使用transform移动时,为什么中间会有空隙?