我已经为特定字段编写了一个异步验证器,为表单的 2 个字段编写了另一个验证器:
this.aliasCtrl = formBuilder.control('', [], [
(control: AbstractControl) => {
return new Promise(resolve => {
if(control.value === 'aaa') {
resolve({error: true});
} else {
resolve(null);
}
});
}
]);
this.formGroup = formBuilder.group({
firstName: formBuilder.control('', []),
lastName: formBuilder.control('', []),
alias: this.aliasCtrl
}, {
asyncValidator: (group: FormGroup) => {
return new Promise(resolve => {
if(group.value.firstName === 'aaa' && group.value.lastName === 'aaa') {
resolve({error2: true});
} else {
resolve(null);
}
});
}
});
它们都正常工作。关键是,当别名控制验证器抛出错误时(当字段包含 aaa
时),"全局"验证器永远不会这样做。
我的问题:http://plnkr.co/edit/vyr48ke7fWEUwrXy43tn?p=preview
如何复制:
- 从第一个字段开始,在所有字段中输入
aaa
。很好,一切正常。 - 重新装填弹道。
- 从最后一个字段开始,在所有字段中输入
aaa
。编辑lastName
字段firstName
时不会调用"全局"验证器(我在 plunker 中添加了一些console.log
来监视何时调用验证器)。
行为是故意的吗?为什么?如果错误已经存在,如何调用"全局"验证器事件?
回答我问题的一种方法是定义一个包含字段firstName
和lastName
的formGroup
。这是一个带有解决方案的 plunker:http://plnkr.co/edit/HAmaYySbxVE15VOl9uJ4?p=preview
作为参考,我在这里发布了我的formGroup
:
this.aliasCtrl = formBuilder.control('', [], [(control: AbstractControl) => {
return new Promise(resolve => {
if(control.value === 'aaa') {
resolve({error: true});
} else {
resolve(null);
}
});
}
]);
this.nameGroup = formBuilder.group({
firstName: formBuilder.control('', []),
lastName: formBuilder.control('', [])
}, {
asyncValidator: (group: FormGroup) => {
return new Promise(resolve => {
if(group.value.firstName === 'aaa' && group.value.lastName === 'aaa') {
resolve({error2: true});
} else {
resolve(null);
}
});
}
});
this.formGroup = formBuilder.group({
name: this.nameGroup,
alias: this.aliasCtrl
});