Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇数行为动态呈现输入类型复选框Angular 2+;_Angular_Checkbox_Dynamic_Behavior - Fatal编程技术网

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

奇数行为动态呈现输入类型复选框Angular 2+;,angular,checkbox,dynamic,behavior,Angular,Checkbox,Dynamic,Behavior,需要: 使用类型属性dynamic创建输入。类似这样的内容: 在表单组(反应式表单)中使用上述输入和“复选框”动态值 问题: 当我动态设置type属性时,问题就出现了,当我用false初始化FormControl时,它导致在DOM中创建一个属性值为false的复选框。因此,表单组永远不会更新 注意事项: 当我直接设置type=“checkbox”时,问题不会发生,因为它不会生成value属性 这种行为在最新版本的Chrome和Firefox中都有体现 这种行为表现在angular@4.4.

需要:

  • 使用类型属性dynamic创建输入。类似这样的内容:
  • 在表单组(反应式表单)中使用上述输入和“复选框”动态值
问题:

当我动态设置type属性时,问题就出现了,当我用false初始化FormControl时,它导致在DOM中创建一个属性值为false的复选框。因此,表单组永远不会更新

注意事项:

  • 当我直接设置type=“checkbox”时,问题不会发生,因为它不会生成value属性
  • 这种行为在最新版本的Chrome和Firefox中都有体现
  • 这种行为表现在angular@4.4.6及angular@5.0.0(我还没有在Angular的其他版本中进行测试)
行为模拟: 您可以通过此链接自己检查行为:

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

这可能是同一问题的另一种风格。对于模型驱动的表单,如果您将输入类型动态设置为“电子邮件”,电子邮件验证将不起作用-浏览器或角度验证不起作用。相反,它将作为文本进行验证。不过,NgModel和所有其他工具都可以工作。假设字段。类型=='email':

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


我几乎可以肯定我已经用一些早期的4.x做到了这一点,并且它起了作用,但可能是记忆在和老人玩把戏。也许我用ngSwitch或ngIf来交换整个输入,我想这也是目前唯一的解决办法。

目前有一个公开的问题,Igor Minar和Angular团队正在研究:

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

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)"/>

我没有看到您的
表单控件在
.ts
中定义。你看过动态表单文档吗?我正在使用FormBuilder,它在内部创建所需的FormControls。该行为与手动FormControl相同。
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);
}