Angular ngModel 单向绑定
Angular ngModel one-way binding
我有 select
控件和 [ngModel]
绑定。 (ngModelChange)
处理程序有一个必须丢弃某些值的自定义检查。我不能只将 [disabled]
放在我的输入上,因为我需要允许用户尝试 select 另一个值并在它无效时显示错误。我有以下组件:
<select [ngModel]="value" (ngModelChange)="onChange($event)">
<option [ngValue]="1">Test 1</option>
<option [ngValue]="2">Test 2</option>
</select>
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
value = 1;
onChange(value: number) {
if (false) { // custom business logic
this.value = value;
}
}
}
我希望当用户尝试 select 值 2 时,它将恢复为值 1,因为模型没有改变。但无论 [ngModel] 绑定如何,它都会发生变化。为什么会发生这种情况,是否有不涉及使用 formControl
而不是 ngModel
的解决方法?
不确定这是否是您要查找的内容,但您可以使用本地模板变量 #select
并将 onChange
方法分配给 select.value
并根据以下内容控制值你的条件。
类似的东西:Stackblitz
您还需要更改“DOM”(*),看看您如何在函数中传递模板引用变量。在 select 的情况下,您需要更改 selectedIndex (在正常输入中,您更改值
<select #select [ngModel]="value" (ngModelChange)="onChange($event,select)">
<option [ngValue]="1">Test 1</option>
<option [ngValue]="2">Test 2</option>
</select>
onChange(value: number,select:HTMLSelectElement) {
if (window.confirm('¿Are you sure?')) { // custom business logic
this.value = value;
}
else
{
select.selectedIndex=this.value==1?0:1
}
}
注意:在示例中,“逻辑”是一个简单的确认,而获取 selectedIndex 的方法有点“硬编码”。我想你有一个包含可能值的数组,在数组中找到索引并给出这个索引
(*)Angular查看模型的变化,但是模型没有变化,所以,没办法显示“相同的值”
我有 select
控件和 [ngModel]
绑定。 (ngModelChange)
处理程序有一个必须丢弃某些值的自定义检查。我不能只将 [disabled]
放在我的输入上,因为我需要允许用户尝试 select 另一个值并在它无效时显示错误。我有以下组件:
<select [ngModel]="value" (ngModelChange)="onChange($event)">
<option [ngValue]="1">Test 1</option>
<option [ngValue]="2">Test 2</option>
</select>
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
value = 1;
onChange(value: number) {
if (false) { // custom business logic
this.value = value;
}
}
}
我希望当用户尝试 select 值 2 时,它将恢复为值 1,因为模型没有改变。但无论 [ngModel] 绑定如何,它都会发生变化。为什么会发生这种情况,是否有不涉及使用 formControl
而不是 ngModel
的解决方法?
不确定这是否是您要查找的内容,但您可以使用本地模板变量 #select
并将 onChange
方法分配给 select.value
并根据以下内容控制值你的条件。
类似的东西:Stackblitz
您还需要更改“DOM”(*),看看您如何在函数中传递模板引用变量。在 select 的情况下,您需要更改 selectedIndex (在正常输入中,您更改值
<select #select [ngModel]="value" (ngModelChange)="onChange($event,select)">
<option [ngValue]="1">Test 1</option>
<option [ngValue]="2">Test 2</option>
</select>
onChange(value: number,select:HTMLSelectElement) {
if (window.confirm('¿Are you sure?')) { // custom business logic
this.value = value;
}
else
{
select.selectedIndex=this.value==1?0:1
}
}
注意:在示例中,“逻辑”是一个简单的确认,而获取 selectedIndex 的方法有点“硬编码”。我想你有一个包含可能值的数组,在数组中找到索引并给出这个索引
(*)Angular查看模型的变化,但是模型没有变化,所以,没办法显示“相同的值”