angular - Angular:将两个表单控件绑定到同一个模型
问题描述
我使用该ControlValueAccessor
界面创建了两个控件——一个日期选择器和一个年龄选择器——并希望使用相同的值将它们绑定在一起。这些代表退休日期和年龄,用户应该能够修改一个并查看另一个输入更新。
我通过订阅form.valueChanges
observable 来做到这一点,如下所示:
this.form.valueChanges.subscribe((val) => {
if (val.retirementDate !== this.currentDatePickerValue) {
// retirement date changed
this.currentDatePickerValue = val.retirementDate;
setTimeout(() => this.retirementAgeCtrl.setValue(this.currentDatePickerValue));
} else if (val.retirementAge !== this.currentAgePickerValue) {
// retirement age changed
this.currentAgePickerValue = val.retirementAge;
setTimeout(() => this.retirementDateCtrl.setValue(this.currentAgePickerValue));
}
});
没有setTimeout()
s,这会导致堆栈异常,但使用它们它可以工作。不幸的是,它的效率并不高,因为当任何一个输入发生变化时,这段代码会运行十几次或更多次。
我怎样才能做到这一点,以便代码只执行必要的次数?
解决方案
将 emitEvent选项传递为 false
emitEvent:当为 true 或未提供(默认值)时,statusChanges 和 valueChanges 可观察对象都会在控件值更新时发出具有最新状态和值的事件。如果为 false,则不会发出任何事件。
this.form.valueChanges.subscribe((val) => {
if (val.retirementDate !== this.currentDatePickerValue) {
// retirement date changed
this.currentDatePickerValue = val.retirementDate;
this.retirementAgeCtrl.setValue(this.currentDatePickerValue, {emitEvent: false})
} else if (val.retirementAge !== this.currentAgePickerValue) {
// retirement age changed
this.currentAgePickerValue = val.retirementAge;
this.retirementDateCtrl.setValue(this.currentAgePickerValue, {emitEvent: false})
}
});
推荐阅读
- mysql - 如何在 MySql PHP 中拆分结果
- java - Java:赋予输入中更高的值更多的权重
- java - 如何使用 JPA 和 Springboot 以 JSON 格式返回子对象详细信息
- python-3.x - Python(beautiful-soup)在爬行时为现有 html 返回“none”
- report - Power BI - 数据建模
- geometry - 一个点在其他两个点之间的坐标,并且知道从起点到目标点的距离
- nginx - Nginx HTTPS only works after page is refreshed
- ssl - Ec2 上的 Cloudflare SSL
- mysql - 上传照片时连接被重置 laravel
- python - 需要在函数迭代中从 Python 转换为 Julia