观察变化时更新控制值

时间:2018-10-19 05:07:36

标签: angular angular-material angular6

我正在通过订阅值更改来观察对反应形式的更改。当表单中未设置某些值时,我会将“角度材质滑动切换”设置为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解决方法。有什么方法可以在观察者表单中设置表单中的值而不延迟它?

1 个答案:

答案 0 :(得分:1)

这可能与MatSlideToggle无关。立即从同一事件的处理程序中触发事件可能是不可预测的。每当您需要在更改发生后 但在更改事件完成之前更改更改事件的结果时(例如在表单valueChanges的情况下),进行更改的正确方法是它会在当前事件周期结束后触发该事件。因此,在这里使用setTimeout是正确的方法。