我有一个Angular2.0.0-beta.9和类型记录1.7应用程序。在这个应用程序中,我创建了一个自定义验证器,它使用多个提供的参数来确定控件是否有效。
我用这个答案作为灵感
下面是我的表单的类构造函数:
constructor(fBuilder: FormBuilder) {
// initialize shift custom validators
this._sVal = new ShiftValidator; // a custom validator class I import
// build form controls
this.shiftForm = fBuilder.group({
'TradeDate': ['2016-03-23', Validators.required],
// other fields removed for brevity
'SupervisorRankID': [0, (c: Control) => this._sVal.valSelectOptional(c, this.requireSupervisor())]
});
}下面是验证器类:
export class ShiftValidator {
// other validations removed for brevity
valSelectOptional(c: Control, required: boolean): { [s: string]: boolean } {
if (Number(c.value) < 1 && required) {
return { 'invalidSelection': true };
}
}
}下面是用于返回验证器第二个参数的布尔值的方法/函数:
requireSupervisor(): boolean {
if (this.currentTrade === undefined) { return false; }
\\ NOTE: currentTrade is a custom class / object that is imported into this module
if (this.currentTrade !== undefined) {
return this.currentTrade.SupervisorApproval;
} else {
return false;
}
}问题
当我传递的booelan值更改为true时,此验证器才会“触发”。当我将requireSupervisor的值更改为false时,验证器不会触发。
问题
有人能帮我弄清楚为什么验证器不每次参数变化时都触发吗?
编辑1:
我尝试了gunter的方法,在复选框中添加了一个(ngModelChange)='requireSupervisor‘,并将ngModelChange函数更改为在整个控制组中包含一个updateValueAndValidate:
requireSupervisor(): boolean {
if (this.currentTrade === undefined) {
this.validateSupervisor();
return false;
}
if (this.currentTrade !== undefined) {
this.validateSupervisor();
return this.currentTrade.SupervisorApproval;
} else {
this.validateSupervisor();
return false;
}
}
validateSupervisor(): void {
if (this.shiftForm !== undefined) {
this.shiftForm.updateValueAndValidity();
}
}如果将上述validateSupervisor函数更改为以下内容,则会得到一个最大调用堆栈超出错误:
validateSupervisor(): void {
if (this.shiftForm !== undefined) {
this.shiftForm.controls['SupervisorRankID'].updateValueAndValidity();
}
}problem :验证器逻辑工作正常,问题是只有在单击/选择复选框时才触发验证程序逻辑。取消选中/取消选中复选框时,不会触发验证器。
有人能帮我弄清楚为什么复选框的未选中操作没有启动验证器吗?
发布于 2016-04-20 00:46:00
看来唯一的选择是:
control.updateValueAndValidity() 尽管应该谨慎地添加它的触发器,以避免意外的更改检测。
柱塞
在本例中,切换required很好,但是如果您试图直接从模板required!=required进行切换,它将失败。
发布于 2016-04-23 17:19:00
AFAIK --这是ControlGroup Validator的预期行为,只对修改后的控件进行验证。
但是您可以像Gunter和kemsky所建议的那样使用updateValueAndValidity来操作这种行为,它只是需要一些微调。
(<Control>this.shiftForm.controls['SupervisorRankID'])
.updateValueAndValidity({onlySelf: true, emitEvent: true})
// do this whenever requirement changes注意:不把它放在requireSupervisor()或validateSupervisor()中,因为这会导致递归。
onlySelf是true,则此更改只会影响此Control的验证,而不会影响其父组件的验证。emitEvent是true,则此更改将导致发出Control上的valueChanges事件。false。发布于 2016-04-08 05:56:55
这应引发验证:
this.shiftForm.controls['SupervisorRankID'].updateValueAndValidity();可能需要一个演员
(<Control>this.shiftForm.controls['SupervisorRankID'])
.updateValueAndValidity();https://stackoverflow.com/questions/36489050
复制相似问题