ПОМИЛКА Помилка: немає доступу до значення для керування формою з невизначеним атрибутом імені на комутаторі


96

Ось мій компонент в Angular 4:

@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)

Коли я міняю перемикач елементів на введення, він працює, знаючи, що я використовую ту саму структуру для інших компонентів, і це працює нормально.



Це , ймовірно , може допомогти вам: stackoverflow.com/questions/46708080 / ...
Dinistro

Відповіді:


138

Я виправив цю помилку, додавши name="fieldName" ngDefaultControlатрибути до елемента, що несе [(ngModel)]атрибут.


33
Деякі додаткові пояснення можуть зробити це кращою відповіддю. Де ви, наприклад, знайшли документацію ngDefaultControl?
isherwood

9
Думаю name="fieldname", не потрібно, але ngDefaultControlвирішує проблему.
michaeak

3
Більше пояснень тут. stackoverflow.com/questions/46465891 / ...
Я nidhin

Додавання "ngDefaultControl" (для атрибута з директивою * ngFor) вирішило мою подібну проблему.
Девідсон Ліма

86

У мене була та сама проблема, і проблема полягала в тому, що мій дочірній компонент мав @inputіменований formControl.

Тому мені просто потрібно було змінити з:

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

до:

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

ts:

@Input()
control:FormControl;

14
Величезна заставка! Дякую, дуже важко відстежити цей.
H Dog

4
Зіткнувся з такою ж точною проблемою
Ахмад Бакташ Хаєрі

1
Був той самий випуск! витратили близько 1 години, перш ніж погуглити і дійти до Вашої відповіді. спасибі
wmehanna

1
Ого, занадто довго було натрапити на це рішення - дякую, що
виклали

Працює з Angular 10, як було сказано в попередньому коментарі, дуже важко відстежити цей, однак згодом має сенс, що "formControl" не повинен використовуватися як ім'я властивості компонента @Input через потенційний конфлікт простору імен , іншим рішенням іменування може бути перейменування поля _formControl, яке подається екземпляром FormControl.
Томас

41

Я також отримав цю помилку під час написання користувацького компонента контролю форми в Angular 7. Однак жодна з відповідей не застосовується до Angular 7.

У моєму випадку до @Componentдекоратора потрібно було додати наступне :

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

Це випадок "я не знаю, чому це працює, але це так". Запишіть це до поганого проектування / реалізації з боку Angular.


6
Цей фрагмент повідомляє рівень введення залежностей Angular про те, що ваш клас слід повернути, коли інші класи (тобто директива formControlName) запитують у нього маркер NG_VALUE_ACCESSOR. Без цього angular не міг би знати, що ваш клас є спеціальним контролем форми (вся інформація про інтерфейси тощо вилучається під час трансляції)
Макс Мамфорд,

18

У мене також була та ж помилка, кутова 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}}


Дякуємо, що врятували мені життя!
Варун Кумар,

7

У мене була та сама помилка - я випадково прив'язав [(ngModel)] до свого mat-form-fieldзамість inputелемента.


Був той самий випуск
Даміт

6

Я отримував це повідомлення про помилку в своїх модульних тестах з Жасмином. Я додав атрибут ngDefaultControl до користувацького елемента (у моєму випадку це було перемикання кутових слайдів матеріалу), і це усуває помилку.

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

Змініть наведений вище елемент, щоб включити атрибут ngDefaultControl

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

5

У моєму випадку я вставив [(ngModel)] на етикетку, а не на введення. Є також застереження: я спробував запустити правильно після зазначеної вище помилки у зазначеному рядку, але помилка не пішла. Якщо є й інші місця, де ви допустили ту саму помилку, це все одно викидає ту саму помилку в той самий рядок


1
Це хороша відповідь. Деякі компоненти (вибір, радіо та ін.) Ви можете підсунути і приклеїти ngModel в неправильному місці, як це. Повідомлення про помилку не дуже допомагає.
AndrewBenjamin

5

Я зіткнувся з цією помилкою під час запуску тестових випадків Karma Unit. Додавання MatSelectModule в імпорті вирішує проблему

imports: [
        HttpClientTestingModule,
        FormsModule,
        MatTableModule,
        MatSelectModule,
        NoopAnimationsModule
      ],

Тільки якщо у вас встановлений "Кутовий матеріал", інакше це вам не потрібно.
Mikefox2k

3

Це якось нерозумно, але я отримав це повідомлення про помилку випадково використовуючи [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: ''
    })
  }
}

Це було для мене теж !! Настільки тонкий, тому що документи дали мені код, з яким я працюю.
Санкофа

2

У моєму випадку я використовував директиву, але не імпортував її у свій файл module.ts. Імпорт виправлено.


Дякую, але мені також потрібно було перезапуститись, ng serveщоб оновити імпорт
FindOutIslamNow

2

У мене була та сама помилка, у мене було поле введення, назване controlв моєму користувацькому компоненті форми, але випадково передавав контроль у введеному імені formControl. Сподіваюся, ніхто не стикається з цією проблемою.


2

У моєму випадку це було настільки сміливо, як зареєструвати новий компонент для DI в моїх app.module.tsдеклараціях, але не в експорті.


1

У моєму випадку це відбувається в моєму спільному модулі, і мені довелося додати наступне в @NgModule:

...
  imports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule,
    IonicModule
  ],
...

Витратив багато годин, щоб це працювало. Сподіваюся, це допомагає деяким іншим, хто бореться з такою помилкою.


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">
             ...

Сподіваюсь, це може бути корисним.


це посилання має подібну проблему :, stackoverflow.com/q/49409674/8992452, можливо, це може допомогти у вирішенні проблеми
NUKE

0

Ви пробували рухаючи [(ngModel)]до divзамість switchв вашому HTML? У мене в коді з'явилася та сама помилка, і це тому, що я прив'язав модель до <mat-option>замість a <mat-select>. Хоча я не використовую контроль форми.


0

У моєму випадку це був компонент.member, який не існував, наприклад

[formControl]="personId"

Додавши його до оголошення класу, це виправлено

this.personId = new FormControl(...)


0

# Фон

  • NativeScript 6.0

У моєму випадку помилку спричинило зміна тегу елемента з на помилку. Усередині <TextView an [(ngModel)] = "name". було визначено.

Після видалення [(ngModel)] = помилка "ім'я" зникла.


-1

у моєму випадку у мене був <TEXTAREA>тег зі старого html під час перетворення в angular. Довелося змінити на <textarea>.


Я не голосував проти, але це НІКОЛИ не повинно бути причиною.
FindOutIslamNow
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.