数组 - 如何在嵌套的 FormArrays 中添加元素?
我有一个数组在另一个数组里,像这样:
<div class="col-sm-6">
<div formArrayName="site_source_pages">
<div *ngFor="let site_source_page of siteForm.controls.site_source_pages.controls; let x=index">
<div [formGroupName]="x">
<div class="card card-accent-success">
<div class="card-header">
<strong>Yeni Kaynak Sayfa</strong>
</div>
<div class="card-block">
<div class="row">
<!--Site Page Source Form Group-->
<div class="form-group">
<div class="form-group col-sm-6">
<label for="page_url">Sayfa Url</label>
<!--<label *ngIf="!site_source_page.controls[x].controls.page_url.valid" class="text-danger">*</label>-->
<input type="text" class="form-control" id="page_url" placeholder="Badge-Manager" formControlName="page_url">
</div>
</div>
<div class="form-group col-sm-6">
<label for="postal-code">Tarama Aralığı</label>
<input type="text" class="form-control" id="postal-code" placeholder="Badge-Email">
</div>
</div>
<div class="row">
<div formArrayName="page_containers">
<div *ngFor="let page_container of site_source_page.controls.page_containers.controls; let i=index">
<div [formGroupName]="i">
<div class="col-sm-4">
<div class="form-group">
<label for="ccnumber">Container {{i + 1}} Type</label>
<label [hidden]="site_source_page.controls.page_containers.controls[i].controls.container_type.valid" class="text-danger">*</label>
<input type="text" class="form-control" id="container_type" placeholder="Container Type" formControlName="container_type">
</div>
</div>
<div class="col-sm-4">
<div class="form-group">
<label for="ccnumber">Container {{i + 1}} Selector Type</label>
<input type="text" class="form-control" id="selector_type" placeholder="Container Selector Type" formControlName="selector_type">
</div>
</div>
<div class="col-sm-4">
<div class="form-group">
<label for="ccnumber">Container {{i + 1}} Css Query</label>
<span class="glyphicon glyphicon-remove pull-right" *ngIf="site_source_page.controls.page_containers.controls.length > 1" (click)="removePageContainer(i)">x</span>
<input type="text" class="form-control" id="container_css_query" placeholder="Container Css Query" formControlName="selector_css_query">
</div>
</div>
<div class="col-sm-12">
<button type="button" class="btn btn-secondary btn-block" (click)="addPageContainer(x)">Container Ekle</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
我想通过 TypeScript 向第二个数组添加项目。我尝试访问第二个数组(page_containers),但出现此错误:
无法读取未定义的属性 'controls'
我的函数是这样的:
addPageContainer(x: number) {
// add container to the list
const controlSp = <FormArray>this.siteForm.controls['site_source_pages'];
const controlPc = <FormArray>controlSp.controls['page_containers'];
controlPc.push(this.initPageContainer());
}
为什么我用这一行代码无法访问第二个数组?
const controlPc = <FormArray>controlSp.controls['page_containers'];
有什么主意吗?
答案#1
尝试使用 get 方法,
controlSp = <FormArray> this.siteForm.get('site_source_pages');
有关更多详细信息,您可以参考 Angular 文档
答案#2
问题是 controlSp 是一个 FormArray,所以要像访问任何其他 普通 数组 一样访问 page_containers,你必须指定索引。
您可以使用 FormArray#at 方法 来实现:
const controlSp = <FormArray>this.siteForm.controls['site_source_pages'];
const controlPc = <FormArray>controlSp.at(x).controls['page_containers'];
或者更好地使用 AbstractControl#get 方法:
addPageContainer(index: number) {
const controlPc = this.siteForm.get(`site_source_pages.${index}.page_containers`) as FormArray;
controlPc.push(this.initPageContainer());
}
另外,正如你可能注意到的,我已将类型转换从 <variable> 改为 as variable。
为什么?因为虽然 as 语法 与 JSX/TSX 语法完全兼容,但反过来则不行。
请注意,如果你对此没有任何问题,你可以使用你喜欢的任何东西。
也就是说,作为建议,你可以大大简化你的 HTML。
而不是(按顺序排列的行):
*ngFor="let site_source_page of siteForm.controls.site_source_pages.controls"
[hidden]="site_source_page.controls.page_containers.controls[i].controls.container_type.valid
*ngIf="site_source_page.controls.page_containers.controls.length > 1
你可以按顺序排列(行):
*ngFor="let site_source_page of siteForm.get('site_source_pages').controls"
*ngIf="page_container.get('container_type').invalid
*ngIf="site_source_page.get('page_containers').length > 1"
另外,仅提一点小建议:
以下行实际上被注释掉了,但它是无效的:
<label *ngIf="!site_source_page.controls[x].controls.page_url.valid" class="text-danger">*</label>
它应该是:
<label *ngIf="!site_source_page.controls.page_url.valid" class="text-danger">*</label>
甚至更好的是:
<label *ngIf="site_source_page.get('page_url').invalid" class="text-danger">*</label>
