ไม่สามารถใช้ ngModel เพื่อลงทะเบียนตัวควบคุมฟอร์มด้วยคำสั่ง formGroup หลัก


93

หลังจากอัปเกรดเป็น RC5 เราเริ่มได้รับข้อผิดพลาดนี้:

ngModel cannot be used to register form controls with a parent formGroup 
 directive.
Try using formGroup's partner directive "formControlName" instead.  Example:

    <div [formGroup]="myGroup">
      <input formControlName="firstName">
    </div>

    In your class:

    this.myGroup = new FormGroup({
       firstName: new FormControl()
    });

      Or, if you'd like to avoid registering this form control,
 indicate that it's standalone in ngModelOptions:

      Example:

      
  <div [formGroup]="myGroup">
     <input formControlName="firstName">
     <input [(ngModel)]="showMoreControls" [ngModelOptions]="{standalone: true}">
  </div>

ดูเหมือนว่าใน RC5 จะไม่สามารถใช้ร่วมกันได้อีกต่อไป แต่ฉันไม่พบทางเลือกอื่น

นี่คือส่วนประกอบที่ทำให้เกิดข้อยกเว้น:

    <select class="field form-control" [formGroup]="form" [(ngModel)]="cause.id" [name]="name">
    <option *ngFor="let c of causes" [value]="c.text">{{c.text}}</option>
    </select>

คุณนำเข้าFormsModuleและReactiveFormsModule?
GünterZöchbauer

แน่นอนทั้งคู่
user2363245

AFAIK คำอธิบายเดียวที่มีอยู่มีดังต่อไปนี้blog.angular-university.io/…
user2363245

พบแหล่งที่มาของการเปลี่ยนแปลง: github.com/angular/angular/pull/10314
user2363245

คำตอบ:


178

คำตอบอยู่ในข้อความแสดงข้อผิดพลาดคุณต้องระบุว่าเป็นแบบสแตนด์อโลนดังนั้นจึงไม่ขัดแย้งกับตัวควบคุมแบบฟอร์ม:

[ngModelOptions]="{standalone: true}"

1
สแตนด์อโลนหมายถึงอะไร?
Jas

2
หมายความว่ามันไม่ได้รับการจัดการโดยรูปแบบฟอร์ม / ข้อมูลดังนั้นคุณจึงสามารถส่งผ่านข้อมูลโดยวัตถุ / โมเดลที่คุณต้องการเหมือนที่เคยเป็นใน AngularJS 1
Avenir Çokaj

ฉันพบปัญหานี้ในการตั้งค่าการทดสอบเท่านั้น อะไรคือสิ่งที่ขาดหายไป? [ngModelOptions] = "{standalone: ​​true}" แก้ไขการทดสอบ แต่เปลี่ยนตรรกะ ngModel สืบทอดมาจากองค์ประกอบหลักซึ่งประกาศว่า ngForm ในกรณีของฉัน
aholbreich

2
Support for using the ngModel input property and ngModelChange event with reactive form directives has been deprecated in Angular v6 and will be removed in Angular v7. https://next.angular.io/api/forms/FormControlName#use-with-ngmodel
WasiF

28

ขยายคำตอบของ @Avenir Çokaj

การเป็นมือใหม่ฉันไม่เข้าใจข้อความแสดงข้อผิดพลาดอย่างชัดเจนในตอนแรก

ข้อความแสดงข้อผิดพลาดระบุว่าใน formGroup ของคุณมีองค์ประกอบที่ไม่ได้รับการพิจารณาใน formControl ของคุณ (ตั้งใจ / บังเอิญ)

หากคุณตั้งใจที่จะไม่ตรวจสอบความถูกต้องของฟิลด์นี้ แต่ยังคงต้องการใช้ ngModel ในองค์ประกอบอินพุตนี้โปรดเพิ่มแฟล็กเพื่อระบุว่าเป็นส่วนประกอบแบบสแตนด์อโลนโดยไม่จำเป็นต้องมีการตรวจสอบความถูกต้องตามที่ @Avenir กล่าวไว้ข้างต้น


6
จะเป็นอย่างไรหากคุณต้องการใช้ if สำหรับการตรวจสอบความถูกต้องและใช้กับ ngModel ในเวลาเดียวกัน?
พอล

ในกรณีของฉันฉันพลาดที่จะประกาศ formControl สำหรับองค์ประกอบภายใน formGroup!
Sagar Khatri


8

เมื่อคุณเขียนformcontrolname Angular 2 ไม่ยอมรับ คุณต้องเขียนformControlName มันเกี่ยวกับคำที่สองตัวพิมพ์ใหญ่

<input type="number" [(ngModel)]="myObject.name" formcontrolname="nameFormControl"/>

หากข้อผิดพลาดยังคงเกิดขึ้นให้ลองตั้งค่าการควบคุมฟอร์มสำหรับฟิลด์วัตถุทั้งหมด (myObject)

ระหว่างเริ่มต้น<form> </form>เช่น:<form [formGroup]="myForm" (ngSubmit)="submitForm(myForm.value)"> set form control for all input field </form>.


5

import { FormControl, FormGroup, AbstractControl, FormBuilder, Validators } from '@angular/forms';


    this.userInfoForm = new FormGroup({
      userInfoUserName: new FormControl({ value: '' }, Validators.compose([Validators.required])),
      userInfoName: new FormControl({ value: '' }, Validators.compose([Validators.required])),
      userInfoSurName: new FormControl({ value: '' }, Validators.compose([Validators.required]))
    });
<form [formGroup]="userInfoForm" class="form-horizontal">
            <div class="form-group">
                <label class="control-label"><i>*</i> User Name</label>
                    <input type="text" formControlName="userInfoUserName" class="form-control" [(ngModel)]="userInfo.userName">
            </div>
            <div class="form-group">
                <label class="control-label"><i>*</i> Name</label>
                    <input type="text" formControlName="userInfoName" class="form-control" [(ngModel)]="userInfo.name">
            </div>
            <div class="form-group">
                <label class="control-label"><i>*</i> Surname</label>
                    <input type="text" formControlName="userInfoSurName" class="form-control" [(ngModel)]="userInfo.surName">
            </div>
</form>


1

ถ้าคอมโพเนนต์มีมากกว่า 1 ฟอร์มให้ลงทะเบียนคอนโทรลและฟอร์มทั้งหมด

ฉันต้องการทราบว่าเหตุใดสิ่งนี้จึงเกิดขึ้นในองค์ประกอบบางส่วนไม่ใช่ในองค์ประกอบอื่น

ปัญหาคือฉันมี 2 แบบฟอร์มในส่วนประกอบเดียวและแบบฟอร์มที่สองยังไม่มี[formGroup]และยังไม่ได้ลงทะเบียนเนื่องจากฉันยังสร้างแบบฟอร์มอยู่

ฉันดำเนินการต่อและเขียนแบบฟอร์มทั้งสองให้เสร็จสมบูรณ์โดยไม่ต้องป้อนข้อมูลที่ไม่ได้ลงทะเบียนซึ่งจะช่วยแก้ปัญหาได้


1

ฉันเพิ่งได้รับข้อผิดพลาดนี้เนื่องจากฉันไม่ได้ใส่ตัวควบคุมฟอร์มทั้งหมดของฉันไว้ภายใน a divด้วยformGroupแอตทริบิวต์

ตัวอย่างเช่นสิ่งนี้จะทำให้เกิดข้อผิดพลาด

<div [formGroup]='formGroup'>
</div>
<input formControlName='userName' />

อาจเป็นเรื่องง่ายที่จะพลาดหากเป็นรูปแบบที่ยาวเป็นพิเศษ


0

หากคุณต้องการที่จะใช้[formGroup]กับformControlNameคุณต้องเปลี่ยนแอตทริบิวต์กับnameformControlNameformControlName

ตัวอย่าง:

ไม่ได้ผลเนื่องจากใช้แอตทริบิวต์[formGroup]andname

<div [formGroup]="myGroup">
   <input name="firstName" [(ngModel)]="firstName">
</div>

คุณควรแทนที่nameแอตทริบิวต์โดยformControlNameและจะทำงานได้ดีดังต่อไปนี้:

<div [formGroup]="myGroup">
   <input formControlName="firstName" [(ngModel)]="firstName">
</div>

วิธีแก้ปัญหานี้อาจเป็นได้หากคุณใช้ [formGroup] = "myGroup" และอ้างอิงภายในด้วย [(ngModel)] คุณสมบัติที่เป็น nog ใน formGroup ลองเพิ่ม [ngModelOptions] = "{standalone: ​​true}" ดังนั้นคุณจึงบอกคอมไพเลอร์ของคุณว่าคอมไพเลอร์ของคุณอาจถูกยกเว้นและเป็นคุณสมบัติแบบสแตนด์อโลน
ProblemAnswerQue

0

ดูเหมือนว่าคุณกำลังใช้ ngModel ในช่องฟอร์มเดียวกันกับ formControlName การสนับสนุนการใช้คุณสมบัติอินพุต ngModel และเหตุการณ์ ngModelChange พร้อมคำสั่งรูปแบบปฏิกิริยาถูกเลิกใช้แล้วใน Angular v6 และจะถูกลบออกใน Angular v7


0

ข้อผิดพลาดนี้จะปรากฏขึ้นเมื่อคุณมีตัวควบคุมฟอร์มบางอย่าง (เช่นอินพุตเลือก ฯลฯ ) ในแท็กกลุ่มฟอร์มของคุณโดยไม่มีคุณสมบัติ formControlName

ตัวอย่างเหล่านี้ทำให้เกิดข้อผิดพลาด:

<form [formGroup]="myform">
    <input type="text">
    <input type="text" [ngmodel]="nameProperty">
    <input type="text" [formGroup]="myform" [name]="name">
</fom>

มีสองวิธีคือแบบสแตนด์อะโลน:

<form [formGroup]="myform">
    <input type="text" [ngModelOptions]="{standalone: true}">
    <input type="text" [ngmodel]="nameProperty" [ngModelOptions]="{standalone: true}">
    <!-- input type="text" [formGroup]="myform" [name]="name" --> <!-- no works with standalone --
</form>

หรือรวมไว้ใน formgroup

<form [formGroup]="myform">
    <input type="text" formControlName="field1">
    <input type="text" formControlName="nameProperty">
    <input type="text" formControlName="name">
</fom>

อันสุดท้ายหมายถึงการกำหนดไว้ใน initialization formGroup

this.myForm =  new FormGroup({
    field1: new FormControl(''),
    nameProperty: new FormControl(''),
    name: new FormControl('')
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.