angular - 如果属性更新太快,UI 控件不会反映模型更改
问题描述
我怀疑我在这里做了一些顽皮的事情,但我不清楚应该如何处理这种情况。
我有一个带有各种选项的选择控件。当用户选择一个选项时,我正在执行检查以确定该值是否在可接受的范围内,如果不是,我将强制将该值设置为可接受的最小值。
发生的事情是选择控制行为不稳定。有时它会更新以显示新的绑定值,而其他时候它只显示选择的内容(尽管基础模型具有预期值)。但是,如果我将检查和属性设置包装在 setTimeout() 函数中,它将按预期运行。
我尝试在设置值后注入 changeDetectorRef 并调用 detectChanges ,但这也不起作用。
演示问题的示例代码:
@Component({
selector: 'my-app',
template: `
<form #form="ngForm">
<div>
<label>Select
<select
name="select"
[(ngModel)]="selected"
(ngModelChange)="onSelectChange()">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
</label>
</div>
<br/>
<div>
<label>Delayed Select
<select
name="delayedSelect"
[(ngModel)]="delayedSelected"
(ngModelChange)="onDelayedSelectChange()">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
</label>
</div>
</form>
`,
})
export class App {
selected: string;
delayedSelected: string;
constructor() {
}
onSelectChange():void {
// nope! can't select 3, 2 is the highest you can go!
if (this.selected === '3'){
this.selected = '2';
}
}
onDelayedSelectChange():void {
setTimeout(()=>{
// nope! can't select 3, 2 is the highest you can go!
if (this.delayedSelected === '3'){
this.delayedSelected = '2';
}},0);
}
}
解决方案
推荐阅读
- flutter - 如何在 pubspec.yaml 中阻止 iOS 而不是 Android 的包?
- sql - 使用连接获取多个表的数据计数
- matlab - 如何使用 Matlab 训练 CNN 从图像中去除噪声
- asp.net - 电子邮件中的可点击链接
- ios - 从 xcode 上传 ios 应用程序时出错
- sockets - 如何基于 for 数据循环关闭飞镖套接字?
- bash - 试图保持一个简单的“计数和邮件”脚本运行
- c - 如何修复此 while 循环用于在其中填充结构数组的另一个结构数组
- matlab - 最小值索引,不包括负值
- android - 如何根据 App Bundle 上支持的纹理压缩拆分资产?