ข้อผิดพลาดข้อผิดพลาด: ไม่มีตัวเข้าถึงค่าสำหรับการควบคุมฟอร์มที่มีแอตทริบิวต์ชื่อที่ไม่ระบุบนสวิตช์


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

คำตอบ:


136

ฉันแก้ไขข้อผิดพลาดนี้โดยการเพิ่มname="fieldName" ngDefaultControlแอตทริบิวต์ให้กับองค์ประกอบที่มี[(ngModel)]แอตทริบิวต์


33
คำอธิบายเพิ่มเติมบางอย่างจะทำให้คำตอบนี้ดีขึ้น ngDefaultControlตัวอย่างเช่นคุณหาเอกสารจากที่ไหน
isherwood

9
ฉันคิดว่าname="fieldname"ไม่จำเป็น แต่ngDefaultControlช่วยแก้ปัญหาได้
michaeak

3
คำอธิบายเพิ่มเติมอยู่ที่นี่ stackoverflow.com/questions/46465891/…
I'm nidhin

การเพิ่ม "ngDefaultControl" (บนแอตทริบิวต์ที่มีคำสั่ง * ngFor) ช่วยแก้ปัญหาที่คล้ายกันของฉัน
Davidson Lima

85

ฉันมีปัญหาเดียวกันและปัญหาคือการที่องค์ประกอบลูกของฉันมีชื่อ@inputformControl

ดังนั้นฉันแค่ต้องเปลี่ยนจาก:

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

ถึง:

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

ts:

@Input()
control:FormControl;

14
ประหยัดชีวิตได้มาก! ขอบคุณยากมากที่จะติดตามอันนี้
H Dog

4
ต้องเผชิญกับปัญหาเดียวกัน
Ahmad Baktash Hayeri

1
มีปัญหาเดียวกัน! เสียเวลาประมาณ 1 ชม. ก่อนที่จะ googling และได้รับคำตอบของคุณ ขอบคุณ
wmehanna

1
ว้าวใช้เวลานานเกินไปกว่าจะพบวิธีแก้ปัญหานี้ - ขอบคุณที่อธิบายให้ชัดเจน
Kabb5

ทำงานร่วมกับ Angular 10 ตามที่กล่าวไว้ในความคิดเห็นก่อนหน้านี้มันยากมากที่จะติดตามอันนี้อย่างไรก็ตามหลังจากนั้นก็สมเหตุสมผลที่ไม่ควรใช้ "formControl" เป็นส่วนประกอบ @Input ชื่อคุณสมบัติเนื่องจากอาจเกิดความขัดแย้งของเนมสเปซ วิธีการตั้งชื่ออื่นอาจเป็นการเปลี่ยนชื่อฟิลด์ _formControl ซึ่งป้อนโดยอินสแตนซ์ FormControl
Thomas

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 หากไม่มีมุมนั้นจะไม่มีทางรู้ว่าคลาสของคุณเป็นตัวควบคุมรูปแบบที่กำหนดเอง (ข้อมูลทั้งหมดเกี่ยวกับอินเทอร์เฟซและอื่น ๆ จะถูกตัดออกในระหว่างการถ่ายโอน)
Max Mumford

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}}


ขอบคุณที่ช่วยชีวิต!
Varun Kumar

7

ฉันมีข้อผิดพลาดเดียวกันนี้ - ฉันบังเอิญผูก [(ngModel)] กับของฉันmat-form-fieldแทนที่จะเป็นinputองค์ประกอบ


มีปัญหาเดียวกัน
Damith

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: ''
    })
  }
}

นี่มันสำหรับฉันด้วย !! ละเอียดมากเพราะเอกสารให้รหัสที่ฉันทำงานด้วย
Sankofa

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แทนที่จะเป็นswitchHTML ของคุณหรือไม่? ฉันมีข้อผิดพลาดเดียวกันปรากฏในรหัสของฉันและเป็นเพราะฉันผูกโมเดลกับ a <mat-option>แทนที่จะเป็น<mat-select>ไฟล์. แม้ว่าฉันไม่ได้ใช้การควบคุมแบบฟอร์ม


0

ในกรณีของฉันมันเป็นส่วนประกอบสมาชิกซึ่งไม่มีอยู่เช่น

[formControl]="personId"

การเพิ่มลงในการประกาศคลาสได้รับการแก้ไข

this.personId = new FormControl(...)

0

ในกรณีของฉันข้อผิดพลาดเกิดจากการทำซ้ำการนำเข้าส่วนประกอบในโมดูล


0

#พื้นหลัง

  • NativeScript 6.0

ในกรณีของฉันข้อผิดพลาดเกิดจากการเปลี่ยนแท็กองค์ประกอบจากเป็นโดยข้อผิดพลาด ภายใน <TextView an [(ngModel)] = "name" ถูกกำหนด

หลังจากลบ [(ngModel)] = "name" error หายไป


-1

ในกรณีของฉันฉันมี<TEXTAREA>แท็กจาก html เก่าในขณะที่แปลงเป็นเชิงมุม ต้องเปลี่ยนเป็น<textarea>.


ฉันไม่ได้ลงคะแนน แต่นี่ไม่ควรเป็นสาเหตุ
FindOutIslamNow
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.