Angular2 RC : Added controls with addControls method after creation of the ControlGroup is not working

标签 angular formbuilder angular2-forms

我有一个添加不同字段的来源(我正在添加新控件,因为只是使用 *ngIf 将它们从模板中隐藏不会将它们从表单中排除,因此导致表单无效)基于选择选项中的所选选项.我正在使用 Angular2 中表单的 addControl 方法向可用表单添加新控件。控件添加正确,但我不知道为什么在用户输入后这些添加的控件的值没有更新。这是我向表单添加新控件的方式:

signUpForm: ControlGroup;

constructor(private fb: FormBuilder) { }

ngOnInit(): void {
    this.signUpForm = this.fb.group({
        firstName: ["", Validators.required],
        lastName: ["", Validators.required],
        group: ["", Validators.required]
    });
}

modifyControls(selectedGroup): number {
    if (selectedGroup == 1) {
        if (this.signUpForm.contains("studentID")) {
            this.signUpForm.removeControl("studentID");
        }
        this.signUpForm.addControl("teacherCode", new Control("", Validators.required));//need some custome validations
        this.signUpForm.addControl("teacherID", new Control("", Validators.required));
        return 1;
    }
    else if (selectedGroup == 2) {
        if (this.signUpForm.contains("teacherCode")) {
            this.signUpForm.removeControl("teacherCode");
            this.signUpForm.removeControl("teacherID");
        }
        this.signUpForm.addControl("studentID", new Control("", Validators.required));
        return 2;
    }
}

看起来 angular 无法识别这些新字段。我认为它与 AbstractControl 有关,但文档中缺少相关内容。这是问题的快照,动态添加的控件没有被 Angular 拾取。 enter image description here

为了展示这个问题,我在下面的 plunker 中创建了一个简单的例子(请转到版本 2 来复制这个问题)。

https://plnkr.co/edit/RI4JL4Pnf2LrJ3TsxsSt?p=preview

我做错了什么以及如何让它与当前设置一起工作? 实现相同行为的其他选择是什么?

谢谢你的帮助

解决方法:

modifyControls(selectedGroup) {
    if (selectedGroup == 1) {
        this.signUpForm.controls['teacherCode'].validator = Validators.required;
        this.signUpForm.controls['teacherCode'].updateValueAndValidity();
        this.signUpForm.controls['teacherID'].validator = Validators.required;
        this.signUpForm.controls['teacherID'].updateValueAndValidity(); 
        this.signUpForm.controls['studentID'].validator = null;
        this.signUpForm.controls['studentID'].updateValueAndValidity();
    }
    else if (selectedGroup == 2) {
        this.signUpForm.controls['teacherCode'].validator = null;
        this.signUpForm.controls['teacherCode'].updateValueAndValidity();
        this.signUpForm.controls['teacherID'].validator = null;
        this.signUpForm.controls['teacherID'].updateValueAndValidity();
        this.signUpForm.controls['studentID'].validator = Validators.required;
        this.signUpForm.controls['studentID'].updateValueAndValidity(); 

    }
}

最佳答案

例如,仅当 teacherCode.value 具有值时才执行 required 验证:

    this.signUpForm.addControl("teacherCode", new Control("", 
        (c:Control) => { 
          if(this.signUpForm.controls['teacherID'].value) {
            return Validators.required(c);
          }
        })
    );

关于Angular2 RC : Added controls with addControls method after creation of the ControlGroup is not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37490663/

相关文章:

java - 如何在 Angular 7 中使用字符串添加动态查询参数?

angular - 如何在 Angular 共享库中创建模型?

ruby-on-rails - 如何修改 Rails 3 表单生成器

angular - FormArray TypeError : value. forEach 不是函数

javascript - 创建没有 Angular ui 路由器的多步表单

Angular 7 Route 动画在嵌套路由器 socket 中不起作用

angular - 如果 'router-outlet' 是 Angular 组件,则验证它是否是该模块的一部分。 Angular 12

javascript - Angular 2 : Ajax form data return null

angular - 触摸/未触摸未在自定义输入组件中更新 - Angular 2

javascript - (Angular 2) 如何根据另一个下拉列表选择填充下拉列表