Estou tentando iterar sobre um formArray em meu componente, mas recebo o seguinte erro
Error: Cannot find control with unspecified name attribute
Aqui está a aparência da lógica em meu arquivo de classe
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()])
});
}
}
e meu arquivo de modelo
<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>
loops
angular
angular2-forms
Bazinga777
fonte
fonte
[formGroup]="areasForm"
está correto porqueareasForm
é uma variável em seu componente TS, enquantoareas
não é. É propriedade deareasForm
:)No meu caso, resolvi o problema colocando o nome do formControl entre aspas duplas e sinlge para que seja interpretado como uma string:
semelhante a abaixo:
fonte
O problema para mim era que eu tinha
Ao invés de
fonte
Ao invés de
Você deve usar:
Dicas :
Como você está fazendo um loop sobre os controles, você já tem a variável
area
, portanto, pode substituí-la:de:
fonte
Para mim, eu estava tentando adicionar
[formGroupName]="i"
e / ouformControlName
e esquecendo-se de especificar o paiformArrayName
. Preste atenção à sua árvore de grupo de formulários.fonte
formArrayName
em um DOM elemento mais acima na hierarquia do que[formGroupName]="i"
(por exemplo, sobre o elemento loop:<div *ngFor=let ctrl of formArrayCtrl; let i = index"><div [formGroupName]="i"></div></div>
)Isso estava acontecendo comigo porque eu tinha, em
fromArrayName
vez de emformArrayName
algum lugar 😑fonte
Então, eu tinha este código:
Aqui eu estava usando o formControl autônomo e estava recebendo o erro do qual estamos falando, o que não fazia sentido para mim, já que eu não estava trabalhando com formgroups ou formarrays ... ele só desapareceu quando adicionei o * ngIf ao select ele mesmo, então não está sendo usado antes de realmente existir. Foi isso que resolveu o problema no meu caso.
fonte
Isso aconteceu comigo porque deixei um formControlName vazio (
formControlName=""
). Como não precisava daquele controle de formulário extra, excluí-o e o erro foi resolvido.fonte