gpt4 book ai didi

angular - 如何在设置或获取之前拦截FormControl的值?

转载 作者:太空狗 更新时间:2023-10-29 17:07:50 24 4
gpt4 key购买 nike

这个问题不言自明。我想拦截 FormControl 的值属性的传入值,并能够拦截它所连接到的 HTML 控件的传出值。

假设我有一个名为“firstName”的 FormControl,我将它连接到一个文本框:

<input type="text" formControlName="firstName" />

默认情况下,当用户在文本框中输入值并提交时,FormControl 的值会设置为文本框中的值。有什么办法可以拦截设置的值并在设置之前修改它?

同样,有什么方法可以拦截FormControl 发送给HTML 控件的值吗?例如,如果我将 FormControl 的值设置为某个值,但我想修改显示在文本框中的值。

我知道我可以使用 ngModel 作为表单和控件之间的中介,但是当使用多个控件时这会变得很麻烦。我也知道您可以创建自己的控件并实现 ControlValueAccessor,但这也很麻烦,因为我必须为每个要使用的控件创建相应的控件。

有关我为什么问这个问题的更多信息,请参阅 https://github.com/ionic-team/ionic/issues/7121

最佳答案

您可以编写一个可重用的指令来拦截来自 View 和进入 View 的值:

const MODIFIER_CONTROL_VALUE_ACCESSOR: Provider = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => ValueModifierDirective),
multi: true,
};

@Directive({
selector: '[valueModifier]',
host: { '(keyup)': 'doSomething($event)' },
providers: [MODIFIER_CONTROL_VALUE_ACCESSOR],
})
export class ValueModifierDirective implements ControlValueAccessor {

@Input() valueModifier: [Function, Function];

private writeToForm;

constructor(public _el: ElementRef) { }

doSomething(event: Event) {
const viewToForm = this.valueModifier[0];
this.writeToForm(viewToForm(event.target.value));
}

registerOnChange(fn: (value: any) => void) {
this.writeToForm = fn;
}

registerOnTouched(fn: any) {
// nothing to do
}

writeValue(value: any) {
const formToView = this.valueModifier[1];
this._el.nativeElement.value = formToView(value);
}
}

要使用它,只需将指令添加到您应用 formControlName 的同一元素并传递转换函数:

@Component({
selector: 'my-app',
template: `
<form [formGroup]="form">
<input [valueModifier]="[viewToForm, formToView]" name="value" type="text" formControlName="input" />
<button (click)="random()">Set Random Value</button>
</form>
`,
styleUrls: ['./app.component.css']
})
export class AppComponent {
form = new FormGroup({
input: new FormControl(1)
});
viewToForm = (text: string) => "toForm" + text;
formToView = (text: string) => "toView" + text;

constructor() {
this.form.valueChanges.subscribe(value => console.log(value));
}

random () {
this.form.patchValue({
input: Math.random()
})
}
}

实例(Stackblitz):

https://stackblitz.com/edit/angular-afmkxl?file=src%2Fapp%2Fapp.component.ts

以上适用于文本输入。我认为您可以为其他类型的输入编写类似的指令。

关于angular - 如何在设置或获取之前拦截FormControl的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45579466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com