177

这是我的 Angular 组件:

@Component( {
    selector: 'input-extra-field',
    template: `
            <div class="form-group" [formGroup]="formGroup" >
                <switch [attr.title]="field.etiquette" 
                    [attr.value]="field.valeur" [(ngModel)]="field.valeur"
                    [formControl]="fieldControl" [attr.id]="name" [attr.disabled]="disabled">
                </switch>
                <error-messages [control]="name"></error-messages>
            </div>
    `
} )

这是我的课:

export class SwitchExtraField extends ExtraField {
    @Input() field: ExtraFormField;
    @Input() entity: { fields: Object };
    @Input() formGroup: FormGroup;

    constructor( formDir: NgForm ) {
        super( null, null, formDir );
    }

    get disabled(): string {
        if ( this.field && !!this.field.saisissable && !this.field.saisissable )     {
            return 'disabled';
        }
        return null;
    }
}

这是我在编译时遇到的错误:

ERROR Error: No value accessor for form control with unspecified name attribute
  at _throwError (forms.es5.js:1918)
  at setUpControl (forms.es5.js:1828)
  at FormControlDirective.webpackJsonp.../../../forms/@angular/forms.es5.js.FormControlDirective.ngOnChanges (forms.es5.js:4617)

当我将元素开关更改为输入时,它可以工作,因为我知道我对其他组件使用相同的结构并且它工​​作正常。

4

27 回答 27

247

I fixed this error by adding the name="fieldName" ngDefaultControl attributes to the element that carries the [(ngModel)] attribute.

于 2017-12-13T14:22:05.373 回答
160

我遇到了同样的问题,问题是我的子组件有一个@input名为formControl.

所以我只需要改变:

<my-component [formControl]="formControl"><my-component/>

至:

<my-component [control]="control"><my-component/>

ts:

@Input()
control:FormControl;
于 2019-01-17T18:48:50.393 回答
63

在 Angular 7 中编写自定义表单控件组件时,我也收到了这个错误。但是,没有一个答案适用于 Angular 7。

就我而言,需要将以下内容添加到@Component装饰器中:

  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => MyCustomComponent),  // replace name as appropriate
      multi: true
    }
  ]

这是一个“我不知道它为什么有效,但它确实有效”的案例。将其归结为 Angular 的糟糕设计/实现。

于 2019-02-18T21:31:40.703 回答
31

我也有同样的错误,角度 7

 <button (click)="Addcity(city.name)" [(ngModel)]="city.name"  class="dropdown-item fontstyle"
     *ngFor="let city of Cities; let i = index">
      {{city.name}}
 </button>

我刚刚添加了 ngDefaultControl

   <button (click)="Addcity(city.name)" [(ngModel)]="city.name"  ngDefaultControl class="dropdown-item fontstyle"
 *ngFor="let city of Cities; let i = index">
  {{city.name}}

于 2019-03-15T15:32:25.307 回答
18

我在运行 Karma 单元测试用例时遇到了这个错误在导入中添加MatSelectModule修复了这个问题

imports: [
        HttpClientTestingModule,
        FormsModule,
        MatTableModule,
        MatSelectModule,
        NoopAnimationsModule
      ],
于 2019-11-14T06:21:19.067 回答
12

我在 Jasmine 的单元测试中收到此错误消息。我向自定义元素添加了ngDefaultControl属性(在我的情况下,它是一个有角度的材质幻灯片切换),这解决了错误。

<mat-slide-toggle formControlName="extraCheese">
  Extra Cheese
</mat-slide-toggle>

更改上述元素以包含ngDefaultControl属性

<mat-slide-toggle ngDefaultControl formControlName="extraCheese">
 Extra Cheese
</mat-slide-toggle>
于 2019-12-27T05:38:50.330 回答
11

就我而言,我忘记添加providers: [INPUT_VALUE_ACCESSOR]到我的自定义组件

我将 INPUT_VALUE_ACCESSOR 创建为:

export const INPUT_VALUE_ACCESSOR = {
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => TextEditorComponent),
  multi: true,
};
于 2021-02-07T19:46:41.040 回答
9

我遇到了同样的错误-我不小心将 [(ngModel)] 绑定到我的mat-form-field而不是input元素。

于 2019-07-02T19:47:07.550 回答
8

当我将其中一个组件输入命名为“formControl”时,我也收到了此错误。可能它是为其他东西保留的。如果要在组件之间传递 FormControl 对象,请像这样使用它:

@Input() control: FormControl;

不是这样的:

@Input() formControl: FormControl;

奇怪 - 但工作:)

于 2020-12-11T14:30:11.203 回答
7

在我的情况下,我使用了指令,但没有将它导入到我的 module.ts 文件中。导入修复它。

于 2019-07-26T09:44:52.287 回答
7

就我而言,问题是我@Input使用保留名称创建了一个变量formControl

于 2021-02-22T12:26:50.977 回答
7

这有点愚蠢,但我不小心使用[formControl]而不是[formGroup]. 看这里:

错误的

@Component({
  selector: 'app-application-purpose',
  template: `
    <div [formControl]="formGroup"> <!-- '[formControl]' IS THE WRONG ATTRIBUTE -->
      <input formControlName="formGroupProperty" />
    </div>
  `
})
export class MyComponent implements OnInit {
  formGroup: FormGroup

  constructor(
    private formBuilder: FormBuilder
  ) { }

  ngOnInit() {
    this.formGroup = this.formBuilder.group({
      formGroupProperty: ''
    })
  }
}

正确的

@Component({
  selector: 'app-application-purpose',
  template: `
    <div [formGroup]="formGroup"> <!-- '[formGroup]' IS THE RIGHT ATTRIBUTE -->
      <input formControlName="formGroupProperty" />
    </div>
  `
})
export class MyComponent implements OnInit {
  formGroup: FormGroup

  constructor(
    private formBuilder: FormBuilder
  ) { }

  ngOnInit() {
    this.formGroup = this.formBuilder.group({
      formGroupProperty: ''
    })
  }
}
于 2019-01-18T06:22:25.787 回答
6

就我而言,它发生在我的共享模块中,我必须将以下内容添加到@NgModule:

...
  imports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule,
    IonicModule
  ],
...
于 2020-03-05T13:40:46.070 回答
5

就我而言,我在标签上插入了 [(ngModel)] 而不是输入。还有一个警告,我尝试在指定行中正确运行上述错误但错误不会消失。如果您在其他地方犯了同样的错误,它仍然会在同一行抛出同样的错误

于 2019-08-17T05:44:01.120 回答
5

<option>如果您尝试将 ngModel 添加到HTML 标签等非输入元素,也会发生此错误。确保只将 ngModel 添加到<input>标签中。在我的例子中,我添加了一个 ngModel<ion-select-option>而不是<ion-select>.

于 2021-01-06T08:48:48.863 回答
3

如果这对某人有帮助,我会收到此错误,因为我在选择的选项标签内有 ngModel。

错误地(我的),我有这个:

<select class="form-control">
    <option *ngFor="let mystate of data.states" value="{{mystate.stateAbbreviation}}" [(ngModel)]="dependent.state">{{mystate.stateName}}</option>
</select>

而不是这个:

<select class="form-control" [(ngModel)]="dependent.state">
    <option *ngFor="let mystate of data.states" value="{{mystate.stateAbbreviation}}" >{{mystate.stateName}}</option>
</select>
于 2021-10-03T19:56:57.380 回答
3

我在 mat-select 中使用了 formControl,如下所示:

<mat-select [formControl]="control">
 ...
</mat-select>

我意识到 MatSelectModule 没有导入到规范文件中,这解决了这个问题。

于 2021-06-14T16:42:58.453 回答
2

我遇到了同样的错误,我有一个control在我的自定义表单组件中命名的输入字段,但不小心在名为formControl. 希望没有人面临这个问题。

于 2019-09-26T09:44:32.670 回答
2

app.module.ts就我而言,这就像在我的声明中为 DI 注册新组件但在出口中没有注册一样愚蠢。

于 2020-09-22T01:17:13.840 回答
1

在我的情况下,它是一个不存在的 component.member 例如

[formControl]="personId"

将其添加到类声明中修复了它

this.personId = new FormControl(...)
于 2019-12-25T13:04:32.153 回答
1

看起来“formControl”是Angular Forms的保留名称,当我将此名称用作组件的输入时,我的实际控制出现了意外行为。如果你问我,这是一个 Angular 错误。只需将您的输入名称替换为“frmCtrl”或其他名称,它就会起作用。

于 2021-10-12T15:37:04.970 回答
0

我在运行单元测试时遇到了这个问题。为了解决这个问题,我将 MatSlideToggleModule 添加到我的 spec.ts 文件中的导入中。

于 2020-11-24T18:16:53.540 回答
0

您是否尝试过将您的移动[(ngModel)]到HTML 中的div而不是?switch我的代码中出现了同样的错误,这是因为我将模型绑定到 a<mat-option>而不是 a <mat-select>。虽然我没有使用表单控件。

于 2019-12-02T06:31:35.413 回答
0

在我的情况下,错误是由复制模块中的组件导入触发的。

于 2020-10-19T22:41:03.277 回答
0

#背景

  • 原生脚本 6.0

在我的情况下,错误是通过将元素标签从故障更改为触发的。在 <TextView 内部是一个 [(ngModel)]="name"。被定义。

删除 [(ngModel)]="name" 后错误消失了。

于 2020-11-07T22:30:42.087 回答
0

我有同样的错误,但在我的情况下,显然这是一个同步问题,在渲染组件 html 时。

我遵循了此页面上提出的一些解决方案,但其中任何一个都对我有用,至少不完全。

真正解决我的错误的是在元素的父 html 标记内编写以下代码片段。

我正在绑定到变量。

代码:

    *ngIf="variable-name"

该错误显然是由项目试图渲染页面引起的,显然在评估变量的那一刻,项目只是找不到它的值。使用上面的代码片段,您可以确保在呈现页面之前询问变量是否已初始化。

这是我的 component.ts 代码:

import { Component, OnInit } from '@angular/core';
import { InvitationService } from 'src/app/service/invitation.service';
import { BusinessService } from 'src/app/service/business.service';
import { Invitation } from 'src/app/_models/invitation';
import { forEach } from '@angular/router/src/utils/collection';

@Component({
  selector: 'app-invitation-details',
  templateUrl: './invitation-details.component.html',
  styleUrls: ['./invitation-details.component.scss']
})
export class InvitationDetailsComponent implements OnInit {
  invitationsList: any;
  currentInvitation: any;
  business: any;
  invitationId: number;
  invitation: Invitation;

  constructor(private InvitationService: InvitationService, private BusinessService: 
BusinessService) { 
this.invitationId = 1; //prueba temporal con invitacion 1
this.getInvitations();
this.getInvitationById(this.invitationId);
  }

   ngOnInit() {

  }

  getInvitations() {
    this.InvitationService.getAllInvitation().subscribe(result => {
      this.invitationsList = result;
      console.log(result);
    }, error => {
      console.log(JSON.stringify(error));
    });
  }

  getInvitationById(invitationId:number){
    this.InvitationService.getInvitationById(invitationId).subscribe(result => {
      this.currentInvitation = result;
      console.log(result);
      //this.business=this.currentInvitation['business'];
       //console.log(this.currentInvitation['business']); 
     }, error => {
     console.log(JSON.stringify(error));
    });
  }
      ...

这是我的 html 标记:

<div class="container-fluid mt--7">
  <div class="row">
    <div class="container col-xl-10 col-lg-8">
      <div class="card card-stats ">
        <div class="card-body container-fluid form-check-inline" 
         *ngIf="currentInvitation">
          <div class="col-4">
             ...

我希望这会有所帮助。

于 2019-08-29T13:54:52.080 回答
-1

就我而言,我<TEXTAREA>在转换为 angular 时有一个来自旧 html 的标签。不得不改成<textarea>

于 2020-01-27T21:29:27.270 回答