【发布时间】:2020-05-06 21:46:28
【问题描述】:
基本上我的问题是,当连接速度很慢时,用户可以多次按下保存按钮并且正在保存多个数据。此问题不会在本地发生,但在暂存时会发生。
虽然我已经设置了 this.hasBeenSubmitted = true;当请求完成并根据条件在按钮上[禁用]时,用户仍然能够多次单击按钮并且可以保存多次,这是错误的。
有人说 Angular rxjs debounce 可以解决这个问题,有人可以告诉我这个问题吗?谢谢你。根据下面的代码,它将如何帮助我解决问题。谢谢。
代码
save(): void {
const create = this.requestFormService.createRequestData(this.form, this.respondents)
.subscribe(
(results: FeedbackRequest[]) => {
this.hasBeenSubmitted = true;
},
(error) => {
this.hasBeenSubmitted = false;
this.handleInvalidFields(error, 'Failed to save the Feedback Request as draft. One or more fields contain invalid values. Input a valid value to proceed.');
this.messageDialogService.show('Failed to save the Feedback Request as draft. One or more fields contain invalid values. Input a valid value to proceed.', true);
create.unsubscribe();
}
);
}
html
<button [disabled]="form.invalid || (!duplicateMode && !form.dirty) || (!editMode) || hasBeenSubmitted"
mat-raised-button *ngIf="form" (click)="save()" type="submit">
<ng-container>
<span>SAVE</span>
</ng-container>
</button>
【问题讨论】:
-
为什么不在执行异步方法之前设置禁用标志?无论请求需要多长时间,这都将防止额外的按钮点击。您始终可以在成功或错误时重新启用。
-
你的意思是在create()之前?
-
是的,这在禁用按钮方面很常见。它不依赖于从服务器获得响应的时间长度。它立即被禁用。
-
好的,但是在执行 create() 之前更新方法 save 以将 hasBeenSubmitted 设置为 true
-
我所要做的就是打开多个标签,然后你就回到了第一格。您不能仅仅通过限制 Web 客户端的实例中的并发请求来解决此问题。
标签: javascript angular typescript rxjs