奇怪的行为动态呈现输入类型复选框的类型 Angular 2+

Odd behavior rendering dynamically type of input type checkbox Angular 2+

需要:

问题:

当我动态设置 type 属性时出现问题,它导致在 DOM 中创建属性值="false" 的复选框当我用 false 初始化 FormControl 时。因此 FormGroup 永远不会更新。

备注:

行为模拟: 您可以在 link 上自行检查行为:https://stackblitz.com/edit/angular-gitter-ke3jjn

我真的很想了解这种行为是否正常以及原因。 谢谢!

这可能是同一问题的另一种形式。对于模型驱动的表单,如果您将输入类型动态设置为 'email',电子邮件验证将不起作用 - 浏览器或 Angular 验证不起作用。相反,它被验证为文本。 NgModel 和其他所有东西都可以工作。假设 field.type==='email':

<input *ngFor="field in fields" [type]="field.type" [(ngModel)]="field.model" [required]="field.required"/>

我几乎可以肯定我已经用一些早期的 4.x 完成了这个并且它有效,但可能是记忆与老人的把戏。也许我使用 ngSwitch 或 ngIf 来交换整个输入,我想这也是目前唯一的解决方法。

目前有一张公开票,Igor Minar 和 Angular 团队正在调查:

https://github.com/angular/angular/issues/7329

与此同时,您可以执行以下解决方法:

onChange(event) {   
    this.form.get(event.target.attributes.formcontrolname.value)
    .setValue(event.target.checked);
}  

然后在您的 html 中添加:

<input id="check" type="{{'checkbox'}}" formControlName="checkOdd (change)="onChange($event)"/>

您还可以在 onChange 中添加条件以检查输入的类型并对其执行不同的操作,例如:

onChange(event) {  
    if(event.target.type === 'checkbox') {
      console.log('Checkbox'); 
    }
    if(event.target.type === 'text') {
      console.log('text'); 
    }

    this.form.get(event.target.attributes.formcontrolname.value)
    .setValue(event.target.checked);
}  

https://stackblitz.com/edit/angular-gitter-kzunhk?file=app/app.component.ts