Дочерний компонент формы, отмеченный как затронутый при загрузке — должен быть нетронутым

#angular #reactive

#angular #реактивный

Вопрос:

У меня есть родительский компонент формы, который использует дочерний компонент формы. Я использую угловые реактивные формы. Мои функции проверки работают правильно, но проблема в том, что при загрузке формы дочерний компонент формы уже помечен как затронутый, что приводит к сбоям в моих функциях проверки:

 this.editUserForm = this.fb.group ({
  phone: ['123-456-1234'],
  fax: [null],
  email: [null],
  website: [null],
  editUserForm_Address : this.fb.group ({
    address1: ['123 Elm Street', Validators.required],
    address2: [null],
    city: ['Dummy City', Validators.required],
    state: ['Dummy State', Validators.required],
    zipcode: ['11111', Validators.required],
    country: ['USA', Validators.required]
  })
});
  

Родительский компонент html использует дочерний компонент:

 <form [formGroup] = "editUserForm">
<address-form formGroupName = "editUserForm_Address"></address-form>
</form>
  

Класс дочернего компонента похож:

 export class AddressFormComponent implements OnInit {

  public addressFormGroup: FormGroup;

  @Input()

  constructor(private controlContainer: ControlContainer) { }

  ngOnInit() {
    this.addressFormGroup = <FormGroup>this.controlContainer.control;
  }

}
  

HTML дочернего компонента выглядит следующим образом (просто адрес 1 для примера):

    <ng-container [formGroup] = "addressFormGroup">   
    <div class = "row">
     <div class = "form-group col-12" [ngClass]="{'error': (addressFormGroup.controls['address1'].errors)">
       <label for="street" >Address 1*</label>
       <input placeholder = "Address 1" class="form-control" formControlName="address1">
       <div *ngIf="(addressFormGroup.controls['address1'].errors)" class="error-msg">
        <div [hidden]="!addressFormGroup.controls['address1'].errors.required"
 class = "input_feedback">Address 1 is required.</div>
       </div>
     </div>
  

Что я пробовал:
Я пытался использовать перехваты жизненного цикла, такие как ngAfterViewInit(), чтобы пометить дочернюю FormGroup как нетронутую, но выполняется ngAfterViewInit (), а затем загружается форма, при этом дочерняя FormGroup по-прежнему помечена как затронутая.

Ответ №1:

Все, что вам нужно сделать, это передать formgroup дочернему компоненту и показать эту formgroup в шаблоне. Так что просто отметьте как @Input и все 🙂

 <address-form 
  [editUserForm_Address]="editUserForm.get('editUserForm_Address')">
</address-form>
  

Затем в дочернем элементе просто отметьте:

 @Input() editUserForm_Address: FormGroup;
  

Также в шаблоне я бы предложил использовать get() for formfield и hasError() для проверки ошибок в formgroup, что, на мой взгляд, делает шаблон более читаемым 🙂

 <ng-container [formGroup]="editUserForm_Address">   
  <label for="street">Address 1*</label>
  <input placeholder="Address 1" formControlName="address1">
  <div *ngIf="editUserForm_Address.get('address1').errors">
    <div [hidden]="!editUserForm_Address.hasError('required','address1')">
      Address 1 is required.
    </div>
  </div>
</ng-container>
  

Образец StackBlitz

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

1. Это сработало! Я не уверен почему, но похоже, что передача formgroup дочернему элементу в качестве ControlContainer вызывала проблему, хотя я не уверен на 100%. Я попытался передать formgroup с помощью @Input () точно так, как вы описали, и это решило мою проблему. Дочерняя форма больше не отображается по умолчанию как затронутая. Большое вам спасибо!