gpt4 book ai didi

angular - 在自定义 Angular 组件中访问 FormControl

转载 作者:行者123 更新时间:2023-12-03 18:30:39 25 4
gpt4 key购买 nike

我正在创建一个自定义 Angular 组件,当我的 FormControl(响应式(Reactive)表单)无效时,它会显示错误工具提示。
但我不知道如何访问自定义组件中的 FormControl 以检查它是否被标记为有效。

我要完成的

<div [formGroup]="form">
<input formControlName="name" type="text" />
<custom-validation-message formControlName="name">My special error message!</custom-validation-message>
</div>


已经遇到的东西

ERROR Error: No value accessor for form control with name: 'surveyType'



通过使用 NG_VALUE_ACCESSOR 实现 ControlValueAccessor 来解决此问题,即使我不想更改该值。我还添加了一个注入(inject)器来访问 NgControl。

import { Component, OnInit, Injector } from '@angular/core';
import { NgControl, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

@Component({
selector: 'custom-validation-message',
templateUrl: './validation-message.component.html',
providers: [{
provide: NG_VALUE_ACCESSOR, multi: true, useExisting: ValidationMessageComponent
}]
})
export class ValidationMessageComponent implements ControlValueAccessor, OnInit {
public formControl: any;

constructor(private injector: Injector) {
super();
}

public ngOnInit(): void {
const model = this.injector.get(NgControl);
this.formControl = model.control;
}

public writeValue(obj: any): void {
}
public registerOnChange(fn: any): void {
}
public registerOnTouched(fn: any): void {
}
public setDisabledState?(isDisabled: boolean): void {
}
}


当前问题
model.control 未定义。检查模型后,我发现模型和空一样好,只有 _parent 是我表单的完整表示。 model._parent.controls 确实包含我表单的所有控件。但我仍然不知道当前的控制。

最佳答案

正如我告诉你的那样,你只想为显示表单控件验证消息制作一个组件,另一个答案解释了为什么 ControlValueAccessor 不是这里的情况,你只想将控件表单引用传递给组件然后检查验证状态,Thomas Schneiter答案是正确的,但我面对这种情况,很难通过 get 方法保持重新访问,有时我们在子组和表单数组中,所以我的想法是将表单控件的名称作为字符串传递,然后获取控制引用。

自定义验证消息组件

@Component({
selector: "custom-validation-message",
templateUrl: "./custom-validation-message.component.html",
styleUrls: ["./custom-validation-message.component.css"]
})
export class CustomValidationMessageComponent {
@Input()
public controlName: string;

constructor(@Optional() private controlContainer: ControlContainer) {}

get form(): FormGroup {
return this.controlContainer.control as FormGroup;
}

get control(): FormControl {
return this.form.get(this.controlName) as FormControl;
}
}

模板

<ng-container *ngIf="control && control?.invalid && control?.touched">
<ul>
<li *ngIf="control.hasError('required')">
this is required field
</li>
<li *ngIf="control.hasError('pattern')">
pattern is invalid
</li>
<li *ngIf="control.hasError('maxlength')">
the length is over the max limit
</li>
<!-- <li *ngFor="let err of control.errors | keyvalue">
{{err.key}}
</li> -->
</ul>

</ng-container>

你可以像这样使用它

<form [formGroup]="form">
<label>
First Name <input type="text" formControlName="firstName" />
<div>
<custom-validation-message controlName="firstName"></custom-validation-message>
</div>
</label>

...

</form>

demo 🚀🚀

you can check this angular library ngx-valdemort created by JB Nizet where it solve this problem perfectly 👌.

关于angular - 在自定义 Angular 组件中访问 FormControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59513861/

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