Angular 在反应性窗体字段上应用管道的“热”
我有一个关于管道的问题: 假设有一个管道应用于反应形式的领域Angular 在反应性窗体字段上应用管道的“热”,angular,angular-pipe,Angular,Angular Pipe,我有一个关于管道的问题: 假设有一个管道应用于反应形式的领域 [value]="form.get(formControlName).value | pipeName” 第一次将值设置到表单字段时,它工作正常。现在,有一个进程正在将模型与表单值同步。如果表单字段被重置为与以前相同的值,则不会调用管道 您可能会说-只是不要再次为表单设置相同的值,这样做是正确的。由于一些限制,很难不这样做,因此我们需要找到一个解决方案 例如:如果视图的值为“112”,则管道会将该值转换为“11 2/4” 当我执行t
[value]="form.get(formControlName).value | pipeName”
第一次将值设置到表单字段时,它工作正常。现在,有一个进程正在将模型与表单值同步。如果表单字段被重置为与以前相同的值,则不会调用管道
您可能会说-只是不要再次为表单设置相同的值,这样做是正确的。由于一些限制,很难不这样做,因此我们需要找到一个解决方案
例如:如果视图的值为“112”,则管道会将该值转换为“11 2/4”
当我执行this.form.get(formControlName).setValue('112')
时,不会应用管道转换,值保持为'112'
在此之后,将不会执行调用管道,字段值将保持原始状态,并且不会被管道逻辑转换
这有意义吗
[更新#1]
在尝试使管道不纯后,它实际上使用相同的输入参数调用它,但管道转换的结果不会应用回模板
[更新#2]
编辑了我试图实现的解释。我认为这是因为您没有更新表单值。 请在更改值后尝试以下操作
this.form.get(formControlName).setValue(‘112’)
this.form.updateValueAndValidity();
你应该像这里说的那样把管子弄脏 Angular在每个组件更改检测周期内执行不纯净管道
只需在管道装饰器中将属性
pure
设置为false
,这样做很奇怪,因为您应该将表单控件绑定到输入,而不是将表单控件值绑定到输入值:
<input [formControl]="form.get(formControlName)" >
将其视为一个值流,并使用异步订阅,将结果馈送到管道中我认为这是预期的行为,因为管道最关键的好处之一是缓存值,避免不必要地运行代码。你的烟斗不干净吗?你在做过滤和排序之类的事情吗?如果它是一个纯管道(通常应该是这样),那么它总是返回相同的值,对吗?您可以将管道设置为
不纯净:false
,它将在每次接收输入时运行。是的,管道是不纯净的,但这与点无关。考虑这个例子。假设字段值有一个值“a”,管道将其转换为笑脸:)。但下一次表单字段值设置为相同的“a”时,笑脸将消失-显示原始值“a”。这就是问题所在。因此您正在尝试使用value
而不是使用setValue()
更新被动表单元素的值?在同一输入元素上是否同时有value
和formControlName
(来自FormBuilder/FormGroup/FormControl)?是的,我有'value'和'formControlName'。不确定这是否是正确的方法。这没有帮助。那么,将管道应用于被动表单字段值的正确方法是什么?使用所需的值设置该值,或者编写实现控制值访问器的指令以格式化该值。请检查问题的编辑版本。此外,您建议在[value]中设置管道的方式也没有什么区别。您需要更详细地说明您的实际目标是什么/您试图实现什么以及为什么要这样设置
[value]="form.get(formControlName).valueChanges | async | pipeName”