防止在 angular 上提交太多表单

Preventing to submit too many forms on angular

开始学习angular,正在练习angular。为此,我创建了一个与表单相关的应用程序。我可以创建一个表单并保存它,然后我可以显示它。

我现在的问题是,我正在努力防止,例如,提交超过 20 个表单。在 20 个表单之后,我想显示一条错误消息。

为此,我创建了几个函数,但它们在 HTML 中运行得不够好。我的代码如下。

post-create.component.ts

export class PostCreateComponent {
   private postCounter = 0;

   @Output() postCreated = new EventEmitter<Post>();

   onAddPost(form: NgForm) {
      if (form.invalid) {
         return;
      }

      const post: Post = {
        title: form.value.title,
        content: form.value.content
      };

      this.postCreated.emit(post);
   }

   onAddPostCount() {
      this.postCounter++;
      console.log(this.postCounter);
   }

   onGetPostCount() {
     return this.postCounter;
   }
}

post-create.component.html

<mat-card>

   <form *ngIf="onGetPostCount() < 20" (submit)="onAddPost(postForm)" #postForm="ngForm" (submit)="onAddPostCount()">
      <mat-form-field>
         <input
           matInput
           type="text"
           name="title"
           ngModel
           required>
      <mat-error *ngIf="postForm.form.get('title')?.invalid">Please enter a title!</mat-error>
      </mat-form-field>
      <mat-form-field>
        <textarea
           matInput
           rows="4"
           name="content"
           ngModel
           required
           #content="ngModel">
        </textarea>
        <mat-error *ngIf="content.invalid">Please enter a content!</mat-error> 
      </mat-form-field>
      <button
         class="button"
         mat-raised-button
         color="primary"
         type="submit">Save Post
      </button>
      <mat-error *ngIf="onGetPostCount() > 20"> Count over 2</mat-error>
   </form>
</mat-card>

我想知道如何防止提交,例如,超过 20 posts?我该如何修复我的代码,或者有什么方法可以使代码变得更快更好?

Live

我会这样做:

  • 只使用一个函数提交表单并添加 onAddPostCount() 提交调用函数中的函数。
  • 在 TS 文件中使用允许和禁止的逻辑,而不是 重复条件超过2-3次

HTML代码:

<mat-card>
    <form (submit)="onAddPost(postForm)" #postForm="ngForm">
        <mat-form-field>
            <input matInput type="text" name="title" ngModel required>
      <mat-error *ngIf="postForm.form.get('title')?.invalid">
        Please enter a title!
      </mat-error>
      </mat-form-field>
      <mat-form-field>
        <textarea matInput rows="4" name="content" ngModel required #content="ngModel">
        </textarea>
        <mat-error *ngIf="content.invalid">
          Please enter a content!
        </mat-error> 
      </mat-form-field>
      <br>
      <button [disabled]="!isAllowToSubmit" class="button" mat-raised-button color="primary" type="submit">
        Save Post
      </button>
      &nbsp;
      <button [disabled]="isAllowToSubmit" class="button" mat-raised-button color="primary" type="button" (click)="resetPostCounter()">Reset
      </button>
      <mat-error *ngIf="!isAllowToSubmit"> 
        Count over 2
      </mat-error>
   </form>
</mat-card>

TS代码:

private postCounter = 0;
private maximumNoOfPosts = 20;

isAllowToSubmit: boolean = true;

@Output() postCreated = new EventEmitter<any>();

onAddPost(form: NgForm) {
  if (form.invalid) {
     return;
  }
  const post: any = {
    title: form.value.title,
    content: form.value.content
  };

  this.postCreated.emit(post);
  this.onAddPostCount();
}

onAddPostCount() {
    if (this.postCounter == this.maximumNoOfPosts) {
      this.isAllowToSubmit = false;
    }
    else {
      this.postCounter++;
    }
}

resetPostCounter(){
    this.postCounter = 0;
    this.isAllowToSubmit = true;
}

StackBlitz