为什么在Angular中使用ValueAccessor?

时间:2019-10-15 10:19:10

标签: angular

我们知道,所有ValueAccessors(我的意思是:NumberValueAccessorRangeValueAccessor等)都是本机输入和Angular {{1}之间的'代理'接口}。

但是使用它的目的是什么?FormControl上调用.valueChanges不是更简单(更好)吗?

2 个答案:

答案 0 :(得分:1)

假设我对制作这样的可重用颜色选择器组件感兴趣。

Color picker component with variable opacity

在此组件内部

您应该实现ControlValueAccessor接口,因为您可以访问很多功能。

  1. writeValue
  2. registerOnChange
  3. registerOnTouched
  4. setDisabledState

借助这些功能,您可以管理控制对象的状态/值。这样,任何组件都可以输入 [formControl] 作为此颜色选择器组件的输入,颜色选择器可以借助这些功能来更新其值,可以将其状态设置为“触摸”或“触摸”。如果未更改,则可以将其有效性设置为有效/无效。基本上,您可以在颜色选择器组件内部完全控制该控件对象,可以执行所需的操作以及在需要时执行的操作。

现在,使用此组件的其他组件可以使用 valueChanges 监听值更改,使用 statusChanges 监听状态更改。等


当您仅对侦听更改感兴趣时,可以使用 valueChanges ,因为在侦听期间您无法更新control的值(因为它会无限循环,因此您将更改该值,然后再次进行valueChanges订阅将再次触发。)


TLDR;

它们都是不同的东西,具有不同的用例。一个接口是类必须实现的接口,而另一个接口是一串更改后的值,任何组件都可以在函数内部侦听。比较这两者是不好的。

答案 1 :(得分:0)

说您想创建一个专门的时间选择器组件。

通过实现ControlValueAccessor *,您可以拥有一个可以直接插入反应式/模板形式的组件。时间选择器组件在内部处理时针变化如何转换为时间,反之亦然。

  

* ControlValueAccessor -定义一个接口,该接口充当Angular表单API和DOM中的本机元素之间的桥梁

.valueChanges是一个Observable,它在控件的值每次更改时发出。您如何将时针的运动转换为formControl值的变化?设定值?祝你好运。