網站搜尋

typescript - 如何防止用戶在 Angular 中多次提交表單?


現在我有一個功能,使用者可以創建新資料並保存,如果資料已存在,將會彈出一個模態窗口,如下所示

現在用戶點擊保存按鈕後,資料會被提交,而在請求仍在等待或加載時,用戶往往會再次點擊該按鈕,然後“資料已存在,是否要繼續保存?”會再次彈出,而這不是我想要的。

所以如你在下面的截圖中所見,請求仍在等待和加載中,所以如果用戶再次點擊,它的彈出窗口將再次顯示。我們如何使用 Angular 來解決這個問題?有什麼好的建議可以幫助嗎?謝謝。

#儲存資料片段

listenToSaveEvent(): void {
    this.saveSubject
      .asObservable()
      .pipe(
        filter((v) => !!v),
        debounceTime(1e3)
      )
      .subscribe(() => {
 
        if (this.respondents.length === 1) {
          return this.checkExistingData();

#檢查現有數據的程式碼

checkExistingData(): void {
    const test = this.formService.checkExisting(this.form)
    .subscribe(res => {
      if (res ) {
        const createExistingSub = this.confirmDialogService.open(
          ERROR_MESSAGES."Data already exists wanna proceed on saving?"
        )
          .componentInstance
          .confirmed
          .subscribe((confirmed) => {
            if (confirmed) {
              return this.createDATA();
            }

            createExistingSub.unsubscribe();
      });
      } else {
          return this.createDATA();
      }
  });

答案#1

您可能想在處理請求時禁用您的按鈕,和/或在按鈕上放置一個加載器。這樣用戶會看到它仍在處理,您也不會再遇到那個問題,從用戶體驗的角度來看會更好。

答案#2

新增一個在上傳前後切換的標誌

`listenToSaveEvent(): void {
    if (this.isUploading) { return;}  // do nothing while uploading
    this.isUploading = true;
    this.saveSubject
      .asObservable()
      .pipe(
        filter((v) => !!v),
        debounceTime(1e3),
        finally(() => this.isUploading === false)   // no matter if it's success or error
      )
      .subscribe(() => {
 
        if (this.respondents.length === 1) {
          return this.checkExistingData();`