Angular 2 Không thể tìm thấy điều khiển có thuộc tính tên không xác định trên formArrays


92

Tôi đang cố gắng lặp lại formArray trong thành phần của mình nhưng tôi gặp lỗi sau

Error: Cannot find control with unspecified name attribute

Đây là logic trông như thế nào trên tệp lớp của tôi

export class AreasFormComponent implements OnInit {
    public initialState: any;
    public areasForm: FormGroup;

    constructor(private fb: FormBuilder) { }

    private area(): any {
      return this.fb.group({
          name: ['', [Validators.required]],
          latLong: ['', [Validators.required]],
          details: ['', [Validators.required]]
      });
    }

    public ngOnInit(): void {
        this.areasForm = this.fb.group({
            name: ['', [Validators.required]],
            areas: this.fb.array([this.area()])
        });
    }
}

và tệp mẫu của tôi

<form class="areas-form" [formGroup]="areasForm" (ngSubmit)="onSubmit(areasForm.values)">
    <md-input-container class="full-width">
        <input mdInput placeholder="Location Name" type="text" formControlName="name" required>
        <md-error *ngIf="areasForm.get('name').hasError('required')">Please enter the locationName</md-error>
    </md-input-container>
    <md-grid-list cols="1" [formArrayName]="areas">
        <md-grid-tile formGroupName="i"  colspan="1" rowHeight="62px" *ngFor="let area of areasForm.controls.areas.controls; let i = index ">
            <md-grid-list cols="3" rowHeight="60px">
                <md-grid-tile colspan="1">
                    <md-input-container class="full-width">
                        <input mdInput placeholder="Area Name" type="text" formControlName="name" required>
                        <md-error *ngIf="areasForm.get('areas').controls[i].name.hasError('required')">Please enter the area name</md-error>
                    </md-input-container>
                </md-grid-tile>
                <md-grid-tile colspan="1">
                    <md-input-container class="full-width">
                        <input mdInput placeholder="details" type="text" formControlName="details" required>
                        <md-error *ngIf="areasForm.get('areas').controls[i].name.hasError('required')">Please enter the locationName</md-error>
                    </md-input-container>
                </md-grid-tile>
                <md-grid-tile colspan="1">
                    <button md-fab (click)="remove(i)"><md-icon>subtract</md-icon>Remove Area</button>
                </md-grid-tile>
            </md-grid-list>
        </md-grid-tile>
    </md-grid-list>
    <button type="submit" [disabled]="areasForm.invalid" md-raised-button color="primary">Submit</button>
</form>

Câu trả lời:


148

Xóa dấu ngoặc khỏi

[formArrayName]="areas" 

và chỉ sử dụng

formArrayName="areas"

Điều này, bởi vì [ ]bạn đang cố gắng ràng buộc một biến , điều này không phải vậy. Ngoài ra, hãy lưu ý gửi của bạn, nó phải là:

(ngSubmit)="onSubmit(areasForm.value)"

thay vì areasForm.values.


Plunkr của bạn bị hỏng?
Jess

2
và [FormGroup] = "domainsForm" có đúng không? Angular thực sự đang đá tôi trong quần ....
greg

Các dấu ngoặc nhọn là những vấn đề trong trường hợp của tôi với formGroupName
Luis Contreras

2
@greg muộn để nhận xét ... [formGroup]="areasForm"là đúng vì areasFormlà một biến trong TS thành phần của bạn, trong khi areasthì không. Đó là tài sản của areasForm:)
AJT82

17

Trong trường hợp của tôi, tôi đã giải quyết vấn đề bằng cách đặt tên của formControl trong dấu ngoặc kép và sinlge để nó được hiểu là một chuỗi:

[formControlName]="'familyName'"

tương tự như bên dưới:

formControlName="familyName"

8

Vấn đề đối với tôi là tôi đã

[formControlName]=""

Thay vì

formControlName=""

1
Tôi cần phải thay đổi từ [formControl] để formControlName
Danilo

7

Thay vì

formGroupName="i"

Bạn phải dùng:

[formGroupName]="i"

Lời khuyên :

Vì bạn đang lặp lại các điều khiển, bạn đã có biến area, vì vậy bạn có thể thay thế điều này:

*ngIf="areasForm.get('areas').controls[i].name.hasError('required')"

bởi:

*ngIf="area.hasError('required', 'name')"

Cảm ơn, đó có vẻ là một phần của vấn đề nhưng câu trả lời ở trên đã giải quyết được vấn đề của tôi.
Bazinga777

4

Đối với tôi, tôi đã cố gắng để thêm [formGroupName]="i"và / hoặc formControlNamequên để xác định cha mẹformArrayName . Chú ý đến cây nhóm biểu mẫu của bạn.


1
Tôi cũng đang sử dụng cả hai. Hãy nhớ đặt formArrayNametrên một phần tử DOM cao hơn trong hệ thống phân cấp hơn [formGroupName]="i"(ví dụ như trên các yếu tố lặp: <div *ngFor=let ctrl of formArrayCtrl; let i = index"><div [formGroupName]="i"></div></div>)
John

1
Chú ý để hình thành cây nhóm đã giúp tôi.
सत्यमेव जयते

3

Điều này đã xảy ra với tôi bởi vì tôi đã fromArrayNamethay vì formArrayNameở đâu đó 😑


1
! @ # $ 🤦🤦🤦🤦🤦
wal

1
@wal Bạn có cùng một vấn đề?
Jacob Stamm

1
vâng, tôi thậm chí đã kiểm tra lỗi đánh máy này sau khi đọc câu trả lời của bạn nhưng đã bỏ lỡ nó lần đầu tiên
wal

1
thánh bò Tôi đã có "formArraryName" và bạn vừa tiết kiệm cho tôi rất nhiều thời gian.
Ashley

0

Điều này xảy ra với tôi vì tôi để trống formControlName ( formControlName=""). Vì tôi không cần kiểm soát biểu mẫu bổ sung đó, tôi đã xóa nó và lỗi đã được giải quyết.


0

Vì vậy, tôi đã có mã này:

<div class="dropdown-select-wrapper" *ngIf="contentData">
    <button mat-stroked-button [disableRipple]="true" class="mat-button" (click)="openSelect()" [ngClass]="{'only-icon': !contentData?.buttonText?.length}">
      <i *ngIf="contentData.iconClassInfo" class="dropdown-icon {{contentData.iconClassInfo.name}}"></i>
      <span class="button-text" *ngIf="contentData.buttonText">{{contentData.buttonText}}</span>
    </button>
    <mat-select class="small-dropdown-select" [formControl]="theFormControl" #buttonSelect (selectionChange)="onSelect(buttonSelect.selected)" (click)="$event.stopPropagation();">
      <mat-option *ngFor="let option of options" [ngClass]="{'selected-option': buttonSelect.selected?.value === option[contentData.optionsStructure.valName]}" [disabled]="buttonSelect.selected?.value === option[contentData.optionsStructure.valName] && contentData.optionSelectedWillDisable" [value]="option[contentData.optionsStructure.valName]">
        {{option[contentData.optionsStructure.keyName]}}
      </mat-option>
    </mat-select>
  </div>

Ở đây tôi đang sử dụng formControl độc lập và tôi đang gặp lỗi mà chúng tôi đang nói đến, điều này không có ý nghĩa gì đối với tôi, vì tôi không làm việc với các nhóm biểu mẫu hoặc biểu mẫu ... nó chỉ biến mất khi tôi thêm * ngIf vào lựa chọn nó tự, vì vậy không được sử dụng trước khi nó thực sự tồn tại. Đó là những gì đã giải quyết vấn đề trong trường hợp của tôi.

<mat-select class="small-dropdown-select" [formControl]="theFormControl" #buttonSelect (selectionChange)="onSelect(buttonSelect.selected)" (click)="$event.stopPropagation();" *ngIf="theFormControl">
          <mat-option *ngFor="let option of options" [ngClass]="{'selected-option': buttonSelect.selected?.value === option[contentData.optionsStructure.valName]}" [disabled]="buttonSelect.selected?.value === option[contentData.optionsStructure.valName] && contentData.optionSelectedWillDisable" [value]="option[contentData.optionsStructure.valName]">
            {{option[contentData.optionsStructure.keyName]}}
          </mat-option>
        </mat-select>
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.