为什么我不能用 Angular NgModel 限制输入值的长度?

Why I can not limit an input's value length with Angular NgModel?

我有一个双向绑定的输入字段,我想将用户输入更改为大写并将其限制为 3 个字符。我在变量的 setter 中这样做。如果我尝试做一个子字符串,大写替换就可以工作,它不再更新字段值,但是 属性 已正确更新。

如果我输入 "abc",它会将其正确替换为 "ABC",但只要我输入超过 3 个字符,其他字符就不会被删除。例如 "abcde" 在输入中显示 "ABCde"。 请参阅 stackblitz 示例:https://stackblitz.com/edit/angular-bpuh8a

<input type="text" id="airport" name="airport" [(ngModel)]="airport">
private _airport = '';
get airport(): string {
  return this._airport;
}
set airport(value: string) {
  this._airport = value.substring(0, 3).toUpperCase();
}

我知道我可以使用 maxlength 限制字段长度并且它有效,但我想了解为什么我在这里所做的不起作用。

我也试过在 ngModelChange 中调用一个方法,但结果是一样的

感谢您的帮助。

首先你需要了解viewModel和model。

当您键入第四个字符时,模型仍然是 ABC,因此 Angular 不会更新 viewModel (Source code),但输入元素仍会响应您的打字。

解决这个问题的方法是手动控制输入元素值。或设置 maxLength.

<label for="airport">Airport </label>
<input #input type="text" id="airport" name="airport" [ngModel]="airport" (ngModelChange)="onChange($event)">
{{ airport }}
import { Component, ViewChild, ElementRef } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {

  @ViewChild('input', { static: false }) input: ElementRef<HTMLInputElement>;
  airport = '';

  onChange(value: string) {
     this.airport = value.substring(0, 3).toUpperCase();
     this.input.nativeElement.value = this.airport;
  }
}

https://stackblitz.com/edit/angular-nwwjs7?file=src/app/app.component.ts