Angular 角度-被动形式的输入值格式

Angular 角度-被动形式的输入值格式,angular,reactive,Angular,Reactive,我有一个使用货币管道的被动形式的输入。当我将表单重置为其初始值时,没有更改此价格值,它将丢失格式 如果我以前更改了货币值,则更新将正确完成 似乎Angular只检查输入的值,而不是正在显示的视图。我的意思是,如果我的价格是15,它显示为15,00欧元,当我重置时,初始值是15,它没有改变。角度改变值,但不改变其显示方式。如果15===15,则角度检查似乎是正确的,如果这是正确的,则不会应用管道格式(甚至使管道不纯净) 因此,我的解决方法是在重置之前检查价格值是否已更改。如果有,我可以毫无问题地继

我有一个使用货币管道的被动形式的输入。当我将表单重置为其初始值时,没有更改此价格值,它将丢失格式

如果我以前更改了货币值,则更新将正确完成

似乎Angular只检查输入的值,而不是正在显示的视图。我的意思是,如果我的价格是15,它显示为15,00欧元,当我重置时,初始值是15,它没有改变。角度改变值,但不改变其显示方式。如果15===15,则角度检查似乎是正确的,如果这是正确的,则不会应用管道格式(甚至使管道不纯净)

因此,我的解决方法是在重置之前检查价格值是否已更改。如果有,我可以毫无问题地继续。但如果没有,我需要使用patchValue,而不考虑价格

这是我的重置方法:(我去掉了注释,因为它们是西班牙语的)

我想知道这是否是处理反应型管道的正确方法。我曾尝试在我的组件中直接使用管道,但它似乎不适合我,因为它修改了值,并在其中插入了格式

可能是相关的(虽然我不这么认为),但我并没有在模板中直接使用CurrencyPipe。我使用一个自定义的dynamicpe调用currencyPipe,以便可以重用我的输入组件。我也遇到了这个问题,因为我无法从喷油器中取出管道。至少我不知道怎么做。因此,我不得不使用一个丑陋的开关来调用正确的管道。如果有人能为我指明正确的方向,我将非常感激

我的动态页面:

import { Pipe, PipeTransform } from '@angular/core';
import { CurrencyPipe } from '@angular/common';

@Pipe({
    name: 'dynamicPipe',
})
export class DynamicPipe implements PipeTransform {

    public constructor(private currency: CurrencyPipe) { }

    transform(value: any, pipeToken: string, pipeArgs: any[]): any {
        if (!pipeToken) {
            return value;
        } else {
            let pipe;

            // I have tried with the Injector but didn’t work
            switch (pipeToken) {
                case 'currency':
                    pipe = this.currency;
                    break;
            }
            return pipe.transform(value, ...pipeArgs);
        }
    }
}
我的输入组件html

<ng-container>
<mat-form-field class="seni-input-container" appearance="standard" floatLabel="always">
    <mat-label>{{ text.label }}</mat-label>
    <input 
        matInput
        [type]="type ? type : 'text'"
        [formControl]="controlContainer.control.controls[controlName]" 
        [value]="pipe ?
            (controlContainer.control.controls[controlName].value | dynamicPipe:pipe.token:pipe.args) :
            controlContainer.control.controls[controlName].value"
        [placeholder]="text.placeholder"
        [required]="hasRequiredField(controlContainer.control.controls[controlName])"
        [readonly]="readonly">
    <mat-error *ngIf="controlContainer.control.controls[controlName].errors">
        {{ utils.currentError(controlContainer.control.controls[controlName]) }}
    </mat-error>
    <mat-hint *ngIf="text.hint">{{ text.hint }}</mat-hint>
</mat-form-field>
</ng-container>

{{text.label}}
{{utils.currentError(controlContainer.control.controls[controlName])}
{{text.hint}}

我不会将[value]与[formControl]混用。@kvetis但是,你会怎么做?。我管理组件中的所有值更改,但我没有找到其他方法以反应形式应用管道。我使用[value]只是为了表示值。我自己没有做过,所以我不会将其作为答案发布,但请尝试查看以下内容:@kvetis。非常感谢您的回复。我以为ControlValueAccesor是用于自定义控件的。我只是使用常规输入。你给我指出了一个不同的方向,对我来说,需要从输入创建一个自定义控件,只是为了能够使用内置管道,这似乎很奇怪。我对编程非常陌生,当然也不熟悉角度。当然,不要试图质疑你善意的回应,但我不明白这是我认为合理的共同问题的方法。我将仔细研究ControlValueAccessor。谢谢!基本上,您正在创建一个自定义控件-一个格式化值的控件,这是一个简单的操作,我理解它似乎太复杂,无法使用CVA。但我相信这是最干净的方法,因为它提供了对值的直接访问——控件到元素数据流中的控件和元素。
<ng-container>
<mat-form-field class="seni-input-container" appearance="standard" floatLabel="always">
    <mat-label>{{ text.label }}</mat-label>
    <input 
        matInput
        [type]="type ? type : 'text'"
        [formControl]="controlContainer.control.controls[controlName]" 
        [value]="pipe ?
            (controlContainer.control.controls[controlName].value | dynamicPipe:pipe.token:pipe.args) :
            controlContainer.control.controls[controlName].value"
        [placeholder]="text.placeholder"
        [required]="hasRequiredField(controlContainer.control.controls[controlName])"
        [readonly]="readonly">
    <mat-error *ngIf="controlContainer.control.controls[controlName].errors">
        {{ utils.currentError(controlContainer.control.controls[controlName]) }}
    </mat-error>
    <mat-hint *ngIf="text.hint">{{ text.hint }}</mat-hint>
</mat-form-field>
</ng-container>