我正在通过订阅值更改来观察对反应形式的更改。当表单中未设置某些值时,我会将“角度材质滑动切换”设置为false(将正在编辑的当前数据记录的“活动”标志设置为false)。
我发现的是我必须推迟在控件上调用setValue,否则下次单击它时不会切换。有一个值更改事件,但该值仍设置为false。大概我正在做的是:
this.editForm.valueChanges.subscribe(form => {
var valid = true;
if (!form.isRequired)
valid = false;
if (!valid) {
setTimeout(()=>{
this.editForm.controls['isActive'].setValue(false);
},1);
}
});
请参见示例,该示例在https://stackblitz.com/edit/angular-fp5tya处没有setTimeout,而在https://stackblitz.com/edit/angular-fp5tya-m9yy7n处具有正确的行为和setTimeout。单击“活动”,然后单击“需要激活”,然后单击“活动”,这两个复选框都将处于活动状态。但是,需要再次单击“活动”。同样,在未设置“必需”的情况下单击“活动”将仅在第二次单击时发出警报,此时表单状态应返回到其原始状态。
我考虑必须使用setTimeout解决方法。有什么方法可以在观察者表单中设置表单中的值而不延迟它?
答案 0 :(得分:1)
这可能与MatSlideToggle无关。立即从同一事件的处理程序中触发事件可能是不可预测的。每当您需要在更改发生后 但在更改事件完成之前更改更改事件的结果时(例如在表单valueChanges的情况下),进行更改的正确方法是它会在当前事件周期结束后触发该事件。因此,在这里使用setTimeout是正确的方法。