Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在内部修改自定义FormControl值并以编程方式发出新值_Javascript_Angular_Angular Reactive Forms_Controlvalueaccessor - Fatal编程技术网

Javascript 如何在内部修改自定义FormControl值并以编程方式发出新值

Javascript 如何在内部修改自定义FormControl值并以编程方式发出新值,javascript,angular,angular-reactive-forms,controlvalueaccessor,Javascript,Angular,Angular Reactive Forms,Controlvalueaccessor,我有一个自定义表单控件,它实现了ControlValueAccessor。我用一个值初始化被动窗体组和控件。我希望在控件组件内部对该值进行变异,并让外部表单获得该变异值 当我与控件交互并通过UI设置新值时,这可以很好地发出onChange()事件,但是初始值(通过FormBuilder设置)在内部更改时不会触发form.valueChanges事件,因此,如果您从未通过UI更改控件的值,则表单永远不会具有修改后的值 我已经找到了确保表单看到变异值的唯一方法,就是在this.onChange(th

我有一个自定义表单控件,它实现了
ControlValueAccessor
。我用一个值初始化被动窗体组和控件。我希望在控件组件内部对该值进行变异,并让外部表单获得该变异值

当我与控件交互并通过UI设置新值时,这可以很好地发出
onChange()
事件,但是初始值(通过
FormBuilder
设置)在内部更改时不会触发
form.valueChanges
事件,因此,如果您从未通过UI更改控件的值,则表单永远不会具有修改后的值

我已经找到了确保表单看到变异值的唯一方法,就是在
this.onChange(this.value)
调用周围包装一个
setTimeout
,这似乎是错误的。尝试找出是否有人尝试过此方法并找到了比
setTimeout
更好的解决方案

下面是一个非常精简的stackblitz来展示场景:


您可以看到内部的值是“hello world”,而外部的表单仅显示“hello”,除非您单击控件内的更新值按钮(该按钮仅设置
value=value
),然后表单会看到它。或者,您可以在<代码> OnCuffe()/代码>调用周围取消<代码> SETTIMEOUT 。我不确定这是否有助于解决我的问题,但值得研究。我确实为ControlValueAccessors编写了很多复制粘贴的样板文件。谢谢,我已经拿了你的例子,把它变成了ngx的子表单,让我知道它是否有用:)好的,哇,我不确定我是否在预期的地方进行了变异,但它似乎在没有设置超时的情况下工作至少:哦,我想我现在得到了你想要的!当然,“代码”> TrimToFrimeGROUP HOOK是这样的:“对于你的问题,你不确定,但是考虑在引擎盖下使用它,它会为你节省很多时间/样板/头痛:”嗯,有趣,@ Maime1992。我不确定这是否有助于解决我的问题,但值得研究。我确实为ControlValueAccessors编写了很多复制粘贴的样板文件。谢谢,我已经拿了你的例子,把它变成了ngx的子表单,让我知道它是否有用:)好的,哇,我不确定我是否在预期的地方进行了变异,但它似乎在没有设置超时的情况下工作至少:哦,我想我现在得到了你想要的!是的,显然,
transformToFormGroup
hook就是为了这个:)