仅在输入验证成功后更新 ngModel

Update ngModel only after successful input validation

提问人:Niko 提问时间:8/26/2021 最后编辑:Niko 更新时间:8/27/2021 访问量:712

问:

我定义了以下输入

    <input
      id="xInputControl"
      name="xInputControl"
      type="text"
      xInput
      class="form-control"
      [(ngModel)]="x"
      #validated="ngModel"
      (ngModelChange)="valueChanged()"
    />

和以下自定义验证程序

@Directive({
  selector: '[xInput]',
  providers: [
    {
      provide: NG_VALIDATORS,
      useExisting: LatestXInputValidatorDirective,
      multi: true,
    },
  ],
})
export class LatestXInputValidatorDirective implements Validator {

  validate(control: AbstractControl): ValidationErrors | null {
    if (
      control.value === undefined ||
      control.value === null ||
      control.value === ''
    ) {
      return { emptyInput: 'dummy text' };
    } else if (
      control.value.indexOf(',') > 0 ||
      control.value.indexOf('.') > 0
    ) {
      return { decimalNumber: control.value };
    } else {
      const parsed = parseInt(control.value);
      if (isNaN(parsed)) return { notANumber: control.value };
      else if (parsed > 200) return { overLimits: control.value };
      else if (parsed < 1) return { negativeNumber: control.value };
      else if (parsed === 1) return { useLatestAggregation: control.value };
      // this the case where the result is valid
      else return null;
    }
  }
}

基于此文档

除非 ngModel 的值通过输入字段的验证,否则不会设置该值。例如:email 类型的输入必须具有 user@domain 形式的值

在这里

ngModel 中的默认行为是,当验证确定模型值无效时,模型值设置为 undefined。

因此,我希望仅在输入通过验证时调用html输入中定义的方法。ngModelChange

不幸的是,事实并非如此。每次我键入内容时都会被调用。我知道这一点,因为这是方法(ngModelChange)="valueChanged()

  valueChanged() {
    console.warn('x is ', this.x);
    ...
  }

每次击键时,我都会在控制台上看到日志

如何仅在输入具有 VALID 值时才调用 get - 通过验证?valueChangedLatestXInputValidatorDirective

JavaScript AngularJS 验证

评论


答:

0赞 Sameh 8/27/2021 #1

在这种情况下,我建议不要使用双重绑定方法。如果具有使用 [()] 语法(也称为“banana-box 语法”)的双向绑定,则 UI 中的值始终会同步回类中的域模型。

[(ngModel)]="x"

你的 html 应该看起来更像这样

<form #it="ngForm" (ngSubmit)="submit(it, $event)>
  <input
  type="text"
  id="xInputControl"
  name="xInputControl"
  class="form-control"
  ngModel
  #xInputControl="ngModel"
  xInput/>

  <button type="submit" [disabled]="!it.valid">
   submit
  </button>
</form>

评论

0赞 Niko 8/27/2021
不过,我没有创建表单的选项。它应该只是一个输入。
0赞 Sameh 8/28/2021
这只是一种演示验证的方法,但您的主要问题是您正在使用双重绑定 [()],这将始终从 UI 更新您的模型