【问题标题】:Child form component marked as touched upon loading - needs to be untouched加载时标记为已触摸的子表单组件 - 需要保持不变
【发布时间】:2019-07-27 03:02:03
【问题描述】:

我有一个使用子表单组件的父表单组件。我正在使用 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 仍被标记为已触摸。

【问题讨论】:

    标签: angular reactive


    【解决方案1】:

    您需要做的就是将表单组传递给孩子,并在模板中显示该表单组。所以只需标记为@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

    【讨论】:

    • 成功了!我不知道为什么,但似乎将表单组作为 ControlContainer 传递给孩子是导致问题的原因,尽管我不是 100%。我尝试完全按照您的描述使用 @Input() 传递表单组,这解决了我的问题。子窗体不再默认为已触摸。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多