Angular 2 formArrays üzerinde belirtilmemiş ad özniteliğine sahip denetim bulunamıyor


92

Bileşenimdeki bir formArray üzerinde yinelemeye çalışıyorum ancak aşağıdaki hatayı alıyorum

Error: Cannot find control with unspecified name attribute

Sınıf dosyamdaki mantık şöyle görünüyor

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()])
        });
    }
}

ve şablon dosyam

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

Yanıtlar:


148

Parantezleri çıkarın

[formArrayName]="areas" 

ve sadece kullan

formArrayName="areas"

Bu, çünkü [ ]sizinle bir değişkeni bağlamaya çalışıyorsunuz , ki bu değil. Ayrıca gönderinize dikkat edin:

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

yerine areasForm.values.


Plunkr'ınız bozulmuş mu?
Jess

2
ve yine de [FormGroup] = "fieldsForm" doğru mu? Angular beni gerçekten pantolonumdan tekmeliyor ....
Greg

Küme parantezleri benim durumumda FormGroupName
Luis Contreras

2
@greg yorum yapmak için geç ... [formGroup]="areasForm"doğru çünkü areasFormTS bileşeninizde bir değişken, oysa areasdeğil. Bu mülkü areasForm:)
AJT82

17

Benim durumumda, formControl adını bir dizge olarak yorumlanacak şekilde çift ve tek tırnak içine koyarak sorunu çözdüm:

[formControlName]="'familyName'"

aşağıdakine benzer:

formControlName="familyName"

8

Benim için sorun, sahip olduğum

[formControlName]=""

Onun yerine

formControlName=""

1
[FormControl] yerine formControlName
danilo

7

Onun yerine

formGroupName="i"

Kullanmalısın:

[formGroupName]="i"

İpuçları :

Kontroller üzerinde döngü oluşturduğunuz için, zaten değişkensiniz area, yani bunu değiştirebilirsiniz:

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

tarafından:

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

Teşekkürler, bu sorunun bir parçası gibi görünüyordu ama yukarıdaki cevap sorunumu çözdü.
Bazinga777

5

Benim için, ben eklemek çalışıyordum [formGroupName]="i"ve / veya formControlNameve üst belirtmek unutmakformArrayName . Form grubu ağacınıza dikkat edin.


1
Ben de kullanıyordum. Koymak unutmayın formArrayNamedaha hiyerarşisinde daha yüksek yukarı DOM-elemana [formGroupName]="i"(örneğin döngü elemana: <div *ngFor=let ctrl of formArrayCtrl; let i = index"><div [formGroupName]="i"></div></div>)
John

1
Grup ağacı oluşturmaya dikkat et bana yardımcı oldu.
सत्यमेव जयते

3

Bu benim için oluyordu çünkü bir yer fromArrayNameyerine formArrayNamesahiptim 😑


1
! @ # $ 🤦🤦🤦🤦🤦
wal

1
@wal Aynı sorunu yaşadınız mı?
Jacob Stamm

1
evet, cevabınızı okuduktan sonra bu yazım hatasını bile kontrol ettim ama ilk seferde kaçırdım
mart

1
kutsal inek "formArraryName" vardı ve sen bana çok zaman kazandırdın.
Ashley

0

Bu bana oldu çünkü bir formControlName boş ( formControlName="") bıraktım . Ekstra form kontrolüne ihtiyacım olmadığı için onu sildim ve hata çözüldü.


0

Yani, bu koda sahiptim:

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

Burada bağımsız formControl kullanıyordum ve bahsettiğimiz hatayı alıyordum, ki bu benim için anlamsızdı, çünkü form grupları veya form dizileriyle çalışmıyordum ... yalnızca * ngIf öğesini seçime eklediğimde kayboldu kendisi, yani gerçekten var olmadan önce kullanılmıyor. Benim durumumda sorunu çözen buydu.

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.