Angular 7 种反应形式 "No value accessor for form control with unspecified name attribute"
Angular 7 Reactive forms "No value accessor for form control with unspecified name attribute"
我正在使用反应式表单,我似乎对看似随机的表单字段有疑问。关于为什么会发生这种情况的任何想法都是有争议的。
我刚开始使用 angular 和 material 7 如果有帮助的话
有趣的是,在表单中添加和删除元素会导致其他元素出现问题。
ERROR Error: No value accessor for form control with unspecified name
attribute
TS
export class VolunteerApplicationPersonalStepComponent implements OnInit
{
public readonly form: FormGroup;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
businessTelephoneExt: [''],
otherTelephone: [''],
otherTelephoneExt: [''],
});
}
}
HTML
<form [formGroup]="form">
<mat-form-field>
<input matInput i18n-placeholder placeholder="Business Extension"
[formControl]="form.get('businessTelephoneExt')">
</mat-form-field>
<app-telephone-input i18n-placeholder placeholder="Other Telephone"
[formControl]="form.get('otherTelephone')">
</app-telephone-input>
<mat-form-field>
<input matInput i18n-placeholder placeholder="Other Extension"
[formControl]="form.get('otherTelephoneExt')">
</mat-form-field>
<br>
<div class="group-margin group-min-width">
<button mat-stroked-button color="primary" matStepperPrevious i18n>Previous</button>
<button mat-raised-button color="primary" matStepperNext (click)="next()" i18n>Next</button>
</div>
</form>
正如有人建议的那样.. formControlName="businessTelephoneExt"
App-Telephone 代码(注意它曾经有 formControl 而不是 appFormControl)
export class TelephoneInputComponent implements OnInit {
@Input() public required = false;
@Input() public placeholder = '';
@Input() public appFormControl: NgControl;
constructor() {
}
public ngOnInit() {
}
}
<mat-form-field>
<input
matInput
type="tel"
[required]="required"
[placeholder]="placeholder"
[formControl]="appFormControl">
<mat-hint i18n>Please enter digits only</mat-hint>
<mat-error
*ngIf="appFormControl.hasError('phone')"
i18n>Invalid phone (requires 10 digits)
</mat-error>
</mat-form-field>
似乎你不能有一个名为 formControl 的 @Input()
从父组件中删除 otherTelephone 表单控件并从子组件中添加 otherTelephone
export class VolunteerApplicationPersonalStepComponent implements OnInit
{
public readonly form: FormGroup;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
businessTelephoneExt: [''],
otherTelephoneExt: [''],
});
}
}
使用controlContainer为子组件提供父表单实例,然后注入FormGroupDiretive获取父表单实例
apptelephoneinput.component.html
@Component({
selector: 'app-telephone-input',
templateUrl: './app-telephone-input.component.html',
styleUrls: ['./app-telephone-input.component.css'],
viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective
}]
})
export class TelephoneInputComponent implements OnInit {
@Input() public required = false;
@Input() public placeholder = '';
childForm;
constructor(private parentF: FormGroupDirective) { }
ngOnInit() {
this.childForm = this.parentF.form;
this.childForm.addControl('otherTelephone', new FormControl(''))
}
}
app-电话-input.component.html
<mat-form-field>
<input
matInput
type="tel"
[required]="required"
[placeholder]="placeholder"
formControl="otherTelephone">
我看到的一件小事是:
<app-telephone-input i18n-placeholder placeholder="Other Telephone"
[formControl]="form.get('otherTelephone')">
</app-telephone-input>
所以应该是:
<app-telephone-input i18n-placeholder placeholder="Other Telephone"
[appFormControl]="form.get('otherTelephone')">
</app-telephone-input>
如果您想创建自定义表单控制器,您应该实现 ControlValueAccessor 接口
ControlValueAccessor {
writeValue(obj: any): void
registerOnChange(fn: any): void
registerOnTouched(fn: any): void
...
}
如果您只实现 ControlValueAccessor 接口,您可以绑定 属性 formControl
@ricardo 的不正确
在使用 ControlValueAccessor 接口时,您可以有一个名为 formControl 的 @Input(),很可能您还没有向提供者添加 NG_VALUE_ACCESSOR 令牌。类似于:
export const VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => MyComponent),
multi: true,
};
@Component({
selector: 'my-component',
templateUrl: './my-component.component.html',
styleUrls: ['./my-component.component.scss'],
providers: [VALUE_ACCESSOR]
})
我正在使用反应式表单,我似乎对看似随机的表单字段有疑问。关于为什么会发生这种情况的任何想法都是有争议的。
我刚开始使用 angular 和 material 7 如果有帮助的话
有趣的是,在表单中添加和删除元素会导致其他元素出现问题。
ERROR Error: No value accessor for form control with unspecified name attribute
TS
export class VolunteerApplicationPersonalStepComponent implements OnInit
{
public readonly form: FormGroup;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
businessTelephoneExt: [''],
otherTelephone: [''],
otherTelephoneExt: [''],
});
}
}
HTML
<form [formGroup]="form">
<mat-form-field>
<input matInput i18n-placeholder placeholder="Business Extension"
[formControl]="form.get('businessTelephoneExt')">
</mat-form-field>
<app-telephone-input i18n-placeholder placeholder="Other Telephone"
[formControl]="form.get('otherTelephone')">
</app-telephone-input>
<mat-form-field>
<input matInput i18n-placeholder placeholder="Other Extension"
[formControl]="form.get('otherTelephoneExt')">
</mat-form-field>
<br>
<div class="group-margin group-min-width">
<button mat-stroked-button color="primary" matStepperPrevious i18n>Previous</button>
<button mat-raised-button color="primary" matStepperNext (click)="next()" i18n>Next</button>
</div>
</form>
正如有人建议的那样.. formControlName="businessTelephoneExt"
App-Telephone 代码(注意它曾经有 formControl 而不是 appFormControl)
export class TelephoneInputComponent implements OnInit {
@Input() public required = false;
@Input() public placeholder = '';
@Input() public appFormControl: NgControl;
constructor() {
}
public ngOnInit() {
}
}
<mat-form-field>
<input
matInput
type="tel"
[required]="required"
[placeholder]="placeholder"
[formControl]="appFormControl">
<mat-hint i18n>Please enter digits only</mat-hint>
<mat-error
*ngIf="appFormControl.hasError('phone')"
i18n>Invalid phone (requires 10 digits)
</mat-error>
</mat-form-field>
似乎你不能有一个名为 formControl 的 @Input()
从父组件中删除 otherTelephone 表单控件并从子组件中添加 otherTelephone
export class VolunteerApplicationPersonalStepComponent implements OnInit
{
public readonly form: FormGroup;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
businessTelephoneExt: [''],
otherTelephoneExt: [''],
});
}
}
使用controlContainer为子组件提供父表单实例,然后注入FormGroupDiretive获取父表单实例
apptelephoneinput.component.html
@Component({
selector: 'app-telephone-input',
templateUrl: './app-telephone-input.component.html',
styleUrls: ['./app-telephone-input.component.css'],
viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective
}]
})
export class TelephoneInputComponent implements OnInit {
@Input() public required = false;
@Input() public placeholder = '';
childForm;
constructor(private parentF: FormGroupDirective) { }
ngOnInit() {
this.childForm = this.parentF.form;
this.childForm.addControl('otherTelephone', new FormControl(''))
}
}
app-电话-input.component.html
<mat-form-field>
<input
matInput
type="tel"
[required]="required"
[placeholder]="placeholder"
formControl="otherTelephone">
我看到的一件小事是:
<app-telephone-input i18n-placeholder placeholder="Other Telephone"
[formControl]="form.get('otherTelephone')">
</app-telephone-input>
所以应该是:
<app-telephone-input i18n-placeholder placeholder="Other Telephone"
[appFormControl]="form.get('otherTelephone')">
</app-telephone-input>
如果您想创建自定义表单控制器,您应该实现 ControlValueAccessor 接口
ControlValueAccessor {
writeValue(obj: any): void
registerOnChange(fn: any): void
registerOnTouched(fn: any): void
...
}
如果您只实现 ControlValueAccessor 接口,您可以绑定 属性 formControl
@ricardo 的
在使用 ControlValueAccessor 接口时,您可以有一个名为 formControl 的 @Input(),很可能您还没有向提供者添加 NG_VALUE_ACCESSOR 令牌。类似于:
export const VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => MyComponent),
multi: true,
};
@Component({
selector: 'my-component',
templateUrl: './my-component.component.html',
styleUrls: ['./my-component.component.scss'],
providers: [VALUE_ACCESSOR]
})