Angular 角度-被动形式的输入值格式
我有一个使用货币管道的被动形式的输入。当我将表单重置为其初始值时,没有更改此价格值,它将丢失格式 如果我以前更改了货币值,则更新将正确完成 似乎Angular只检查输入的值,而不是正在显示的视图。我的意思是,如果我的价格是15,它显示为15,00欧元,当我重置时,初始值是15,它没有改变。角度改变值,但不改变其显示方式。如果15===15,则角度检查似乎是正确的,如果这是正确的,则不会应用管道格式(甚至使管道不纯净) 因此,我的解决方法是在重置之前检查价格值是否已更改。如果有,我可以毫无问题地继续。但如果没有,我需要使用patchValue,而不考虑价格 这是我的重置方法:(我去掉了注释,因为它们是西班牙语的) 我想知道这是否是处理反应型管道的正确方法。我曾尝试在我的组件中直接使用管道,但它似乎不适合我,因为它修改了值,并在其中插入了格式 可能是相关的(虽然我不这么认为),但我并没有在模板中直接使用CurrencyPipe。我使用一个自定义的dynamicpe调用currencyPipe,以便可以重用我的输入组件。我也遇到了这个问题,因为我无法从喷油器中取出管道。至少我不知道怎么做。因此,我不得不使用一个丑陋的开关来调用正确的管道。如果有人能为我指明正确的方向,我将非常感激 我的动态页面:Angular 角度-被动形式的输入值格式,angular,reactive,Angular,Reactive,我有一个使用货币管道的被动形式的输入。当我将表单重置为其初始值时,没有更改此价格值,它将丢失格式 如果我以前更改了货币值,则更新将正确完成 似乎Angular只检查输入的值,而不是正在显示的视图。我的意思是,如果我的价格是15,它显示为15,00欧元,当我重置时,初始值是15,它没有改变。角度改变值,但不改变其显示方式。如果15===15,则角度检查似乎是正确的,如果这是正确的,则不会应用管道格式(甚至使管道不纯净) 因此,我的解决方法是在重置之前检查价格值是否已更改。如果有,我可以毫无问题地继
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>