сброс формы angular 10 вызывает ошибки проверки

#angular #angular-forms

#angular #angular-forms

Вопрос:

Я использую реактивную форму:

 <form
  #f="ngForm"
  class="form"
  [formGroup]="registerForm"
  (ngSubmit)="onSubmit()"
  novalidate
>
  <div class="title-box-form">
    <strong>Company Information</strong>
    <div class="row">
      <div class="form-group col-12">
        <input
          type="text"
          class="form-control pink-border"
          placeholder="Company Name"
          formControlName="company_name"
        />
      </div>
      <span
        class="text-danger"
        *ngIf="
          (registerForm.get('company_name').touched || submitted) amp;amp;
          registerForm.get('company_name').errors?.required
        "
      >
        company name is required
      </span>
    </div>
  </div>
  <div class="form-group col-12">
    <input
      type="text"
      class="form-control pink-border"
      placeholder="Email Address"
      formControlName="email"
    />
  </div>
  <span
    class="text-danger"
    *ngIf="
      (registerForm.get('email').touched || submitted) amp;amp;
      registerForm.get('email').errors?.required
    "
  >
    email name is required
  </span>
  <span
    class="text-danger"
    *ngIf="
      registerForm.get('email').touched amp;amp;
      registerForm.get('email').errors?.email
    "
  >
    Enter a valid email address
  </span>
  <div class="modal-footer">
    <input type="submit" class="btn-blue" />
    <mat-spinner *ngIf="loading"></mat-spinner>
  </div>
</form>
  

После отправки я хочу сбросить форму в функции отправки в файле component.ts, который я делаю

 onSubmit() {
    this.submitted = true;
    if (this.registerForm.valid) {
      this.loading=true;
      
     let values = JSON.stringify(this.registerForm.value);
     //this.registerForm.reset();
     this.form.reset();
    this.form.markAsPristine();
    this.form.markAsUntouched();
    this.form.updateValueAndValidity();
}
  

Я использую:

 export class ManageCustomerComponent implements OnInit {
@ViewChild('f') form;
  

Я пробовал reserform() , markAsPristine но все они вызывают ошибки проверки после сброса формы, мне нужно сбросить форму после отправки, и если снова показать проверку после отправки формы, я импортирую это в верхней части моей страницы:

 import { Component, OnInit, ViewChild , ChangeDetectorRef } from '@angular/core';   
import {SidebarComponent} from '../sidebar/sidebar.component';
import {HeaderComponent} from '../header/header.component';
import { ModalDirective } from 'ngx-bootstrap/modal';

import { Validators, FormGroup, FormBuilder,FormControl,FormGroupDirective,NgForm } from     '@angular/forms';
import {ServerService} from '../server.service';
import { Router } from '@angular/router';
import { HttpClient, HttpParams } from '@angular/common/http';
import Swal from "sweetalert2"
  

проверка

Ниже приведен полный TS-код компонента:

 import { Component, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core';
import { SidebarComponent } from '../sidebar/sidebar.component';
import { HeaderComponent } from '../header/header.component';
import { ModalDirective } from 'ngx-bootstrap/modal';

import {
  Validators,
  FormGroup,
  FormBuilder,
  FormControl,
  FormGroupDirective,
  NgForm,
} from '@angular/forms';
import { ServerService } from '../server.service';
import { Router } from '@angular/router';
import { HttpClient, HttpParams } from '@angular/common/http';
import Swal from 'sweetalert2';

declare var $: any;

@Component({
  selector: 'app-manage-customer',
  templateUrl: './manage-customer.component.html',
  styleUrls: ['./manage-customer.component.css'],
})
export class ManageCustomerComponent implements OnInit {
  @ViewChild('f') form;
  registerForm: FormGroup;
  submitted = false;
  loading = false;
  onSubmit() {
    this.submitted = true;
    if (this.registerForm.valid) {
      this.loading = true;

      let values = JSON.stringify(this.registerForm.value);
      this.server
        .request('POST', '/company/store', {
          company_name: this.registerForm.value.company_name,
          company_email: this.registerForm.value.email,
          company_phone: this.registerForm.value.phone,
          company_phone1: this.registerForm.value.phone1,
          company_fax: this.registerForm.value.fax,
          company_parish: this.registerForm.value.parish,
          company_city: this.registerForm.value.city,
          company_person_title: this.registerForm.value.salutation,
          company_person_first_name: this.registerForm.value.first_name,
          company_person_last_name: this.registerForm.value.last_name,
          company_person_email: this.registerForm.value.email2,
          company_person_phone: this.registerForm.value.work_phone,
          company_person_mobile: this.registerForm.value.mobile_phone,
        })
        .subscribe(
          (data) => {
            this.loading = false;

            Swal.fire({
              position: 'top-end',
              icon: 'success',
              title: 'Company added succesfully',
              showConfirmButton: false,
              showCloseButton: true,
            });
            console.log(data);
            //        let elem = document.getElementById('close2');
            //
            //let evt = new MouseEvent('click', {
            //        bubbles: true,
            //        cancelable: true,
            //        view: window
            //    });
            //
            //elem.dispatchEvent(evt);
            //this.registerForm.reset();

            //this.form.form.reset();
            //this.form.form.markAsPristine();
            //this.form.form.markAsUntouched();
            //this.form.form.updateValueAndValidity();
            this.form.resetForm();
          },
          (error) => {
            this.loading = false;
          }
        );
    }
  }

  constructor(
    private fb: FormBuilder,
    private server: ServerService,
    private http: HttpClient,
    private changeDetectorRef: ChangeDetectorRef
  ) {
    this.registerForm = this.fb.group({
      company_name: ['', Validators.required],
      email: ['', [Validators.required, Validators.email]],
      phone: ['', Validators.required],
      phone1: [''],
      fax: [''],
      parish: [''],
      city: [''],
      mailing_address: [''],
      salutation: [''],
      first_name: [''],
      last_name: [''],
      email2: [''],
      work_phone: [''],
      mobile_phone: [''],
    });
  }

  ngOnInit(): void {}
  ngAfterViewInit() {
    $('.select-custom').selectpicker();
  }
}

  

Комментарии:

1. используете ли вы a updateOn: 'submit' для обновления значений элемента управления формой?

2. @at-in Нет, я просто использую простую отправку и сброс

3. можете ли вы предоставить доступ ко всему файлу component.ts?

4. попробуйте this.form.form.markAsPristine();this.form.form.markAsUntouched();this.form.form.updateValueAndValidity();

5. или form.resetForm();

Ответ №1:

ну, могут быть и другие способы, но, как я вижу, вы используете отправленное логическое значение, вы можете установить для него значение false после отправки данных формы на сервер и использования resetForm в вашей функции подписки API