【问题标题】:Dynamically adding required to input in template driven angular 2 form以模板驱动的角度 2 形式动态添加所需的输入
【发布时间】:2018-07-16 16:08:50
【问题描述】:

模板驱动方法: 动态添加所需属性到 angular 2 形式的输入字段。但是角度表单验证(form.valid)无法识别动态添加的必填字段。

 <input type="text"  [(ngModel)]="coumnName" name="coumnName" >

需要动态添加:

document.getElementsByName(columnName)[0].setAttribute('required', '');

【问题讨论】:

    标签: angular angular2-forms


    【解决方案1】:

    您可以使用与以反应形式为FormControl 动态设置验证器相同的技术,但使用NgForm 指令。怎么会? Angular 对 NgForm 指令的实际作用是创建 FormControl 实例,并注册到您在表单中分配的 name。

    所以你可以做的是导入NgForm、Validators 和ViewChild 来引用你的表单并能够在你的组件中使用它。作为旁注,我看到您的 ngModel 变量与 name 属性相同。那是行不通的,它们必须是独一无二的。

    请执行以下操作:

    <form #f="ngForm">
      <input [(ngModel)]="coumnNameModel" name="coumnName" #coumnName="ngModel">
    </form>
    

    在您的组件中,导入NgForm 和ViewChild,然后使用setValidators() 并设置您想要的任何验证器,然后调用updateValueAndValidity():

    @ViewChild('f') myForm: NgForm;
    
    // when you want to set required validator:
    setRequired() {
      this.myForm.form.get('coumnName').setValidators([Validators.required])
      this.myForm.form.get('coumnName').updateValueAndValidity();
    }
    

    StackBlitz

    【讨论】:

    • 较新版本的 Angular 需要 ViewChild 的两个参数。见:@ViewChild('f', {static:false}) myForm: NgForm;
    【解决方案2】:

    事实上,一旦开始数据绑定,就不再使用 HTML 属性。你没有设置属性。您正在设置 DOM 元素、组件和指令的属性。

    你可以阅读这个official doc

    【讨论】:

      【解决方案3】:

      只需要添加:

      [required]="isConditionIsTrue"
      

      在您的输入中。

      您可以使用条件或布尔值。

      注意:如果您使用 formControls,您应该d:

      添加所需的控件,或任何其他控件:

      this.form.addControl('formControlName', new FormControl(ValueToSet, Validators.required));
      

      如果您想删除所需的控件或任何其他控件:

      this.form.get('formControlName').reset();
      this.form.removeControl('formControlName');
      

      【讨论】:

      • 这不起作用。当条件返回false时,不会重新计算表单的有效性,无法提交表单。
      • Ciao Emanuele,如果您使用 formControls,您应该: 添加所需的控件:this.form.addControl('formControlName', new FormControl(ValueToSet, Validators.required));如果你想删除它: this.form.get('formControlName').reset(); this.form.removeControl('formControlName');如果有帮助,请告诉我!
      • 感谢您的回复。是的,反应形式就是这样。无论如何,似乎需要添加和删除带有代码的验证器以及模板驱动的表单。在您的示例中,一旦 isConditionIsTrue 变为 true,即使 isConditionITrue 变回 false,所需的验证器也会保持活动状态。
      猜你喜欢
      • 2020-09-15
      • 2017-07-23
      • 2017-03-31
      • 1970-01-01
      • 2021-11-21
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多