【问题标题】:angular2 custom template validator has stale valuesangular2 自定义模板验证器具有陈旧的值
【发布时间】:2017-03-19 19:15:12
【问题描述】:

我现在被以下问题困住了一段时间。我正在实现一个 angular 2 自定义验证器,它只是检查一个数字是否在一个范围内。像这样使用,一切正常:

<input type="text" id="doseSimple" class="form-control"
       required 
       name="doseSimple" 
       [(ngModel)]="doseSimple"
       #doseControl ="ngModel"
       validateRange
       from="2"
       to="20"
       >

<div *ngIf="doseControl.errors && (doseControl.dirty || doseControl.touched)">
   <span *ngIf="doseControl.errors.tooSmall">Too small</span>
   <span *ngIf="doseControl.errors.tooBig">Too big</span>
</div> 

就我而言,验证要复杂一些。有一个下拉菜单。 from 和 to 值取决于下拉菜单的选择。只有一个附加到设置 doseFrom doseTo 属性的下拉列表的事件:

  <input type="text" id="name" class="form-control"
         required 
         name="doseComplex" 
         [(ngModel)]="doseComplex"
         #doseComplexControl ="ngModel"
         validateRange
         [from]="doseFrom"
         [to]="doseTo"
         >
  <div *ngIf="doseComplexControl.errors && (doseComplexControl.dirty || doseComplexControl.touched)">
     <span *ngIf="doseComplexControl.errors.tooSmall">Too small</span>
     <span *ngIf="doseComplexControl.errors.tooBig">Too big</span>
  </div> 

验证器验证值,但使用 fromto 来自之前的选择。 from 和 to 的值就像落后了一步。如何解决?

我创建了一个 plunker 来显示问题: https://plnkr.co/edit/C0sbL8pRwsZcEZ5r1ODY?p=preview

【问题讨论】:

  • 一切顺利
  • 不幸的是不是:(。当您在文本框中键入新值时,是的,它工作正常。但是当在下拉列表中选择另一个范围时,验证器具有旧范围。当doseControl.updateValueAndValidity () 被调用(在组件中),验证器尚未获得新值。在调用doseControl.updateValueAndValidity() 之前如何强制绑定更新。

标签: validation angular typescript


【解决方案1】:

我会实现registerOnValidatorChange 方法来让它工作:

export class RangeValidator implements Validator {
  @Input()
  get from() {
    return this._from;
  }
  set from(value: number) {
    this._from = value;
    if (this._onChange) this._onChange();
  }

  @Input()
  get to() {
    return this._to;
  }
  set to(value: number) {
    this._to = value;
    if (this._onChange) this._onChange();
  }

  validate(c: FormControl): { [key: string]: boolean; } {
    ...
  }

  private _from: number;

  private _to: number;

  private _onChange: () => void;

  registerOnValidatorChange(fn: () => void): void { 
    this._onChange = fn; 
  }
}

Modified Plunker

你可以删除updateValueAndValidity

另见角度源代码

【讨论】:

  • 非常丰富的答案 - 谢谢。我在使用 Angular 8 时遇到了类似的问题,但无法在 plunker 上打开您的演示,所以我将您的代码复制到了 Angular 8 模板here on Stackblitz 中。也许别人会觉得它有用。
猜你喜欢
  • 2017-06-28
  • 2017-06-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 2017-03-02
相关资源
最近更新 更多