简化:我有一个计算器,它不会允许" 7"结果(valid
将为false
)。
计算器本身是实现ControlValueAccessor
的组件。
模型是
interface IModel {
a, b, c: number | null;
}
(a
是左侧数字,b
是中间数字,c
是结果)
这就是我写模板的方式:
<input type='text' [ngModel]='myModel.a' (ngModelChange)='calc("a",$event)'/> +
<input type='text' [ngModel]='myModel.b' (ngModelChange)='calc("b",$event)'/> =
<input type='text' readonly [ngModel]='myModel.c' />
我没有在盒子里使用香蕉,因为我必须对输入的每次修改都做一个逻辑。
我没有使用getter / setter,或者在setter中使用getter / setter - 我会在控制更新方面遇到问题。
这就是我使用(ngModelChange)
的原因。每次更改的位置我都会调用calc
函数:
calc(propName,e) {
this.myModel[propName] = e;
this.myModel.c = +this.myModel.a + +this.myModel.b;
this.onChangeCallback(this.myModel);
}
但现在事情变得复杂了。
更改第一个输入时,我必须告诉calc
函数:
calc("a",$event)
和&#34; b&#34;在calc("b",$event)
。但这种相关性对我来说似乎错了:
当然 - 我可以为每个添加模板变量并发送该变量并在calc函数中读取.value
。
但我认为我会采用非棱角分明的方式
问题
更新输入时如何引用控件的模型? (以及设置时自定义逻辑)
PS - 我没有(input)
事件,因为我在Nativescript中使用Angular。
答案 0 :(得分:1)
您可以同时使用banana in a box
和自定义逻辑。
选中此stackblitz
您可以同时使用[(ngModel)]
和(ngModelChange)="calc($event)"
。这样做的目的是首先更新您的模型,然后调用您的自定义函数。
因此,请按以下方式更改标记
<input type='text' [(ngModel)]='myModel.a' (ngModelChange)='calc()'/> +
<input type='text' [(ngModel)]='myModel.b' (ngModelChange)='calc()'/> =
<input type='text' readonly [ngModel]='myModel.c'/>
calc
方法:
calc() {
this.myModel.c = this.myModel.a * 1 + this.myModel.b * 1
}
注意:* 1
用于将字符串解析为数字。这是我想要使用的黑客攻击。
答案 1 :(得分:1)
你可以像这样使用Reactive,在模板文件中不多,即html,所有脏东西都由Typescript处理
<form class="form-horizontal" [formGroup]="calculationForm" novalidate >
<input type='text' "formControlName"='a' /> +
<input type='text' "formControlName"='b'/> =
<input type='text' "formControlName"='c' />
</form>
Ts文件将是
createForm() {
this.calculationForm= this.fb.group({
a: '',
b: '',
c: ''
});
}
get a() {
return this.calculationForm.get('a');
}
get b() {
return this.calculationForm.get('b');
}
get c() {
return this.calculationForm.get('c');
}
private onChanges(): void {
this.a.valueChanges.subscribe(() => this.calculate());
this.b.valueChanges.subscribe(() => this.calculate());
}
private calculate() {
if (this.a.value && this.b.value) {
this.c.setValue(this.a.value + this.b.value , {emitEvent: false});
}
}