Forms angular2 formArray条件验证

Forms angular2 formArray条件验证,forms,validation,angular,Forms,Validation,Angular,我试图将一个字段的更改强加给formGroup中的另一个字段,该formGroup位于该组的多个实例的FormArray中。我正在其中一个字段上使用mydatepicker。例如,当日期更改时,我希望仅验证该组中的“更改原因”字段,以确保未选择第一个选项(值0)。我对此有两个问题: 当我更改日期时,不会立即检查更改原因字段的有效性。只有在我将字段的值更改为1,然后更改为0后,才会发生这种情况。它的默认值设置为0,当我更改日期时,它应立即拾取该值 当它最终意识到表单无效时,它会对所有更新按钮进行更

我试图将一个字段的更改强加给formGroup中的另一个字段,该formGroup位于该组的多个实例的FormArray中。我正在其中一个字段上使用mydatepicker。例如,当日期更改时,我希望仅验证该组中的“更改原因”字段,以确保未选择第一个选项(值0)。我对此有两个问题:

  • 当我更改日期时,不会立即检查更改原因字段的有效性。只有在我将字段的值更改为1,然后更改为0后,才会发生这种情况。它的默认值设置为0,当我更改日期时,它应立即拾取该值
  • 当它最终意识到表单无效时,它会对所有更新按钮进行更新,而不仅仅是对FormGroup中日期字段已更改的按钮进行更新
  • ts文件代码:

    subscribeDateChange(formGroup){
    (this.rfcActionTasksForm).controls.tasks.controls[0]。controls['DueDate'];
    const tasks=formGroup;
    const changes$=tasks.controls['DueDate'].valueChanges;
    更改$.subscribe(dd=>{
    var arrayControl=this.rfcActionTasksForm.get('tasks')作为FormArray;
    var项目=第(1)项的阵列控制;
    控制台日志(项目);
    if(tasks.value['ReasonForChangeId']='0'){
    tasks.controls['ReasonForChangeId'].setValidators(Validators.pattern(/([1-9])/);
    }
    });
    }
    恩戈尼尼特(){
    this.rfcActionTasksForm=this.\u fb.group({
    任务:this.\u fb.array([this.buildTask()]))
    });
    }
    buildTask():FormGroup{
    将此返回。\u fb.group({
    Id:“”,
    操作:['',验证程序。必需],
    步骤:“”,
    AssignedToId:['',验证器。必需],
    指定的颜色:“”,
    到期日:['',验证者。必填],
    原因变更ID:“”,
    原始日期:“”,
    已完成:“”,
    过期:“”
    },{
    验证人:(formGroup:formGroup)=>{
    //返回此.validateDays(formGroup);
    //log(formGroup.controls['DueDate']);
    //this.subscribeDateChange(formGroup.controls['DueDate'],formGroup.controls['ReasonForChangeId']);
    返回此.subscribeDateChange(formGroup);
    }
    });
    }
    
    html:


    我在这里看到了多个问题:

    验证器的格式应为:

    (控件:AbstractControl):{[key:string]:any}=>{
    如果(有效(控制))
    返回null;
    其他的
    返回{“myValidator”:“检测到无效的东西”};
    }
    
    您每次都返回
    未定义的
    ,因此它无法工作。 你不能订阅,因为这意味着每次你在表单中做更改时,你都会重新订阅整个组的值更改,这是没有意义的

    忘记值更改,您需要同步进行控制。检查是否有错误,并使用子控件的
    setError()
    方法

    比如:

    (组:FromGroup):{[key:string]:any}=>{
    如果(!isValid(组)){
    group.get(“myChildControl”).setErrors({“localError”:“error detected!”});
    返回{“groupError”:“检测到错误!”};
    }
    返回null;
    }
    

    我不确定是否应该使用
    setError(errors,{emitEvent:false})
    的第二个参数来避免传播。

    我在这里看到了多个问题:

    验证器的格式应为:

    (控件:AbstractControl):{[key:string]:any}=>{
    如果(有效(控制))
    返回null;
    其他的
    返回{“myValidator”:“检测到无效的东西”};
    }
    
    您每次都返回
    未定义的
    ,因此它无法工作。 你不能订阅,因为这意味着每次你在表单中做更改时,你都会重新订阅整个组的值更改,这是没有意义的

    忘记值更改,您需要同步进行控制。检查是否有错误,并使用子控件的
    setError()
    方法

    比如:

    (组:FromGroup):{[key:string]:any}=>{
    如果(!isValid(组)){
    group.get(“myChildControl”).setErrors({“localError”:“error detected!”});
    返回{“groupError”:“检测到错误!”};
    }
    返回null;
    }
    

    我不确定是否应该使用
    setError(errors,{emitEvent:false})
    的第二个参数来避免传播。

    谢谢。此验证函数需要精确添加到哪里?在构建组时,替换组中的箭头函数
    验证程序:(formGroup:formGroup)=>{…}
    。谢谢。该验证函数需要准确添加到哪里?在构建组时,替换组中的箭头函数
    验证程序:(formGroup:formGroup)=>{…}