[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中调用方法,但结果是相同的
谢谢您的帮助。)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
看起来你正在使用Angular框架,并尝试在输入字段中实现双向数据绑定的同时,限制用户输入为大写并最多三个字符。你的问题在于尽管属性值被正确更新了,但是视图(即输入框显示的内容)没有同步更新到预期的状态。
这个问题可以通过结合使用Angular的ngModelChange
事件和模板引用变量来解决,同时保持对输入长度和大小写的控制。这里是一个改进的方法:
#inputField
)。(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示例中遇到的问题。