首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >表单的自定义“多参数”验证器并不总是会触发

表单的自定义“多参数”验证器并不总是会触发
EN

Stack Overflow用户
提问于 2016-04-07 23:36:57
回答 4查看 544关注 0票数 2

我有一个Angular2.0.0-beta.9和类型记录1.7应用程序。在这个应用程序中,我创建了一个自定义验证器,它使用多个提供的参数来确定控件是否有效。

我用这个答案作为灵感

下面是我的表单的类构造函数:

代码语言:javascript
运行
复制
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())]
  });
}

下面是验证器类:

代码语言:javascript
运行
复制
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 };
    }
  }
}

下面是用于返回验证器第二个参数的布尔值的方法/函数:

代码语言:javascript
运行
复制
    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:

代码语言:javascript
运行
复制
    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函数更改为以下内容,则会得到一个最大调用堆栈超出错误:

代码语言:javascript
运行
复制
validateSupervisor(): void {
    if (this.shiftForm !== undefined) {
        this.shiftForm.controls['SupervisorRankID'].updateValueAndValidity();
    }
}

problem :验证器逻辑工作正常,问题是只有在单击/选择复选框时才触发验证程序逻辑。取消选中/取消选中复选框时,不会触发验证器。

有人能帮我弄清楚为什么复选框的未选中操作没有启动验证器吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-04-20 00:46:00

看来唯一的选择是:

代码语言:javascript
运行
复制
control.updateValueAndValidity() 

尽管应该谨慎地添加它的触发器,以避免意外的更改检测。

柱塞

在本例中,切换required很好,但是如果您试图直接从模板required!=required进行切换,它将失败。

票数 2
EN

Stack Overflow用户

发布于 2016-04-23 17:19:00

AFAIK --这是ControlGroup Validator的预期行为,只对修改后的控件进行验证。

但是您可以像Gunter和kemsky所建议的那样使用updateValueAndValidity来操作这种行为,它只是需要一些微调。

代码语言:javascript
运行
复制
(<Control>this.shiftForm.controls['SupervisorRankID'])
   .updateValueAndValidity({onlySelf: true, emitEvent: true})

 // do this whenever requirement changes

注意:不把它放在requireSupervisor()validateSupervisor()中,因为这会导致递归。

  • 如果onlySelftrue,则此更改只会影响此Control的验证,而不会影响其父组件的验证。
  • 如果emitEventtrue,则此更改将导致发出Control上的valueChanges事件。
  • 这两个选项都默认为false
票数 2
EN

Stack Overflow用户

发布于 2016-04-08 05:56:55

这应引发验证:

代码语言:javascript
运行
复制
this.shiftForm.controls['SupervisorRankID'].updateValueAndValidity();

可能需要一个演员

代码语言:javascript
运行
复制
(<Control>this.shiftForm.controls['SupervisorRankID'])
    .updateValueAndValidity();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36489050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档