ngModel không thể được sử dụng để đăng ký các điều khiển biểu mẫu với chỉ thị formGroup mẹ


90

Sau khi nâng cấp lên RC5, chúng tôi bắt đầu gặp lỗi này:

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>

Có vẻ như trong RC5, cả hai không còn được sử dụng cùng nhau nữa, nhưng tôi không thể tìm thấy giải pháp thay thế.

Đây là thành phần tạo ra ngoại lệ:

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

Bạn đã nhập khẩu FormsModuleReactiveFormsModule?
Günter Zöchbauer

Chắc chắn, cả trong số họ
user2363245

AFAIK, lời giải thích duy nhất tồn tại như sau: blog.angular-university.io/...
user2363245

Tìm thấy nguồn gốc của sự thay đổi: github.com/angular/angular/pull/10314
user2363245

Câu trả lời:


173

Câu trả lời nằm ngay trên thông báo lỗi, bạn cần chỉ ra rằng nó độc lập và do đó nó không xung đột với các điều khiển biểu mẫu:

[ngModelOptions]="{standalone: true}"

1
độc lập có nghĩa là gì?
Jas

2
Nó có nghĩa là nó không được xử lý bởi các mô hình hình thức / dữ liệu, do đó bạn có thể truyền dữ liệu bằng bất kỳ đối tượng / mô hình mà bạn muốn vì nó từng là trong AngularJS 1
Avenir Çokaj

Tôi chỉ thấy vấn đề này trong thiết lập thử nghiệm của mình. Chính xác cái gì còn thiếu? [ngModelOptions] = "{standalone: ​​true}" sửa bài kiểm tra nhưng thay đổi logic. ngModel được thừa hưởng từ thành phần cha mẹ, mà tuyên bố ngForm trong trường hợp của tôi
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

Mở rộng câu trả lời của @Avenir Çokaj

Là một người mới, ngay cả lúc đầu tôi cũng không hiểu rõ ràng về thông báo lỗi.

Thông báo lỗi chỉ ra rằng trong formGroup của bạn, bạn có một phần tử không được tính đến trong formControl của bạn. (Cố ý / Vô tình)

Nếu bạn có ý định không xác thực trường này nhưng vẫn muốn sử dụng ngModel trên phần tử đầu vào này, vui lòng thêm cờ để cho biết đó là một thành phần độc lập không cần xác thực như đã đề cập bởi @Avenir ở trên.


6
Điều gì xảy ra nếu bạn muốn sử dụng nếu để xác nhận VÀ sử dụng nó với ngModel cùng lúc?
Paul

Trong trường hợp của tôi, tôi đã bỏ qua việc khai báo formControl cho một phần tử bên trong formGroup!
Sagar Khatri,


8

khi bạn viết formcontrolname Angular 2 không chấp nhận. Bạn phải viết formControlName . nó là về các từ thứ hai viết hoa.

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

nếu lỗi vẫn xảy ra, hãy thử đặt điều khiển biểu mẫu cho tất cả trường đối tượng (myObject).

giữa bắt đầu <form> </form>ví dụ:<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

Nếu thành phần có nhiều hơn 1 biểu mẫu, hãy đăng ký tất cả các điều khiển và biểu mẫu

Tôi cần biết tại sao điều này lại xảy ra trong một thành phần nhất định mà không phải trong bất kỳ thành phần nào khác.

Vấn đề là tôi đã có 2 biểu mẫu trong một thành phần và biểu mẫu thứ hai chưa có [formGroup]và chưa được đăng ký vì tôi vẫn đang xây dựng biểu mẫu.

Tôi đã tiếp tục và hoàn thành việc ghi cả hai biểu mẫu hoàn chỉnh mà không để lại đầu vào không được đăng ký để giải quyết vấn đề.


1

Tôi chỉ gặp lỗi này vì tôi không đặt tất cả các điều khiển biểu mẫu của mình trong divmột formGroupthuộc tính với một thuộc tính.

Ví dụ, điều này sẽ tạo ra một lỗi

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

Điều này có thể khá dễ dàng để bỏ lỡ nếu nó là một dạng đặc biệt dài.


1

Nếu bạn muốn sử dụng [formGroup]với formControlName, bạn phải thay thế namethuộc tính bằng formControlNameformControlName.

Thí dụ:

Điều này không hoạt động vì nó sử dụng thuộc tính [formGroup]name.

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

Bạn nên thay thế namethuộc tính bằng formControlNamevà nó sẽ hoạt động tốt như sau:

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

giải pháp cho vấn đề này cũng có thể là nếu bạn đang sử dụng [formGroup] = "myGroup" và tham chiếu nội bộ với [(ngModel)] thuộc tính nog trong formGroup. hãy thử thêm [ngModelOptions] = "{standalone: ​​true}" để bạn thông báo với trình biên dịch của mình rằng nó có thể bị loại trừ và nó là một thuộc tính độc lập
ProblemAnswerQue 30/09/19

0

Có vẻ như bạn đang sử dụng ngModel trên cùng một trường biểu mẫu với formControlName. Hỗ trợ sử dụng thuộc tính đầu vào ngModel và sự kiện ngModelChange với các lệnh biểu mẫu phản ứng đã không được chấp nhận trong Angular v6 và sẽ bị loại bỏ trong Angular v7


0

Lỗi này xuất hiện khi bạn có một số điều khiển biểu mẫu (như Đầu vào, Lựa chọn, v.v.) trong thẻ nhóm biểu mẫu của bạn không có thuộc tính formControlName.

Những ví dụ đó dẫn đến lỗi:

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

Có hai cách, độc lập:

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

Hoặc bao gồm nó vào nhóm biểu mẫu

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

Câu cuối cùng ngụ ý xác định chúng trong formGroup khởi tạo

this.myForm =  new FormGroup({
    field1: new FormControl(''),
    nameProperty: new FormControl(''),
    name: new FormControl('')
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.