开发者社区 问答 正文

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

[link](我有一个带有双向绑定的输入字段,我想将用户输入更改为大写并将其限制为3个字符。我在变量的设置器中执行此操作。如果我尝试执行子字符串,则大写替换有效,该子字符串不再更新字段值,但是属性已正确更新。

如果我输入“ abc”,它将正确地替换为“ ABC”,但是当我键入三个以上的字符时,其他字符将不会被删除。例如,“ 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中调用方法,但结果是相同的

谢谢您的帮助。)

展开
收起
被纵养的懒猫 2019-10-09 17:00:28 566 分享 版权
阿里云 AI 助理回答

看起来你正在使用Angular框架,并尝试在输入字段中实现双向数据绑定的同时,限制用户输入为大写并最多三个字符。你的问题在于尽管属性值被正确更新了,但是视图(即输入框显示的内容)没有同步更新到预期的状态。

这个问题可以通过结合使用Angular的ngModelChange事件和模板引用变量来解决,同时保持对输入长度和大小写的控制。这里是一个改进的方法:

  1. 使用模板引用变量:首先,在输入元素上添加一个模板引用变量(例如,使用#inputField)。
  2. 监听ngModelChange事件:然后,在输入字段上使用(ngModelChange)事件监听器来调用一个方法,该方法将执行大小写转换和长度限制,并直接操作DOM以确保视图与模型同步。

示例代码如下:

<input type="text" [(ngModel)]="_airport" (ngModelChange)="onInputChange($event)" #inputField maxlength="3">

在组件类中:

import { Component } from '@angular/core';

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

  onInputChange(event: any) {
    // 更新机场代码为大写并限制长度
    this._airport = event.target.value.toUpperCase().substring(0, 3);
    // 确保DOM值与组件属性值一致
    setTimeout(() => {
      this.inputField.nativeElement.value = this._airport;
    });
  }

  get airport(): string {
    return this._airport;
  }

  set airport(value: string) {
    this._airport = value.substring(0, 3).toUpperCase();
  }
}

在这个解决方案中,onInputChange方法会在每次输入变化时被调用。它首先将输入转换为大写并截取前三个字符,然后通过访问模板引用变量inputField对应的DOM元素,手动设置其value属性,从而强制视图与模型保持一致。注意使用setTimeout是为了确保DOM操作发生在当前变更检测周期之后,这是Angular推荐的做法,以避免某些情况下变更检测不生效的问题。

这种方法应该能解决你在StackBlitz示例中遇到的问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: