我实现了一个子组件,用户可以在其中动态地在集合中添加和删除一组控件。解决方案基于这个SO问题的答案。
它的编译和工作方式就像一个魅力,但在 *ngFor 指令上有一个烦人的消息,上面写着:
标识符"部分"未定义。"__type"不包含这样的 成员角度
我正在使用VS Code作为我的IDE。
我在 *ngIf 指令上看到了类似的错误,当您在条件语句的开头添加双感叹号 (!!( 时,消息就会消失,但在这种情况下,指令使用的是集合而不是布尔值。
我怎样才能让这种碍眼的东西消失?
HTML 如下所示:
<div class="row" [formGroup]="saveForm">
<label for="sections" class="col-md-3 col-form-label">Sections:</label>
<div class="col-md-9">
<a class="add-link" (click)="addSection()">Add Section</a>
<div formArrayName="sections">
<!-- The "problem" seems to be "saveForm.controls.sections" -->
<div *ngFor="let section of saveForm.controls.sections.controls; let i=index" [formGroupName]="i">
<label for="from">From:</label>
<input class="form-control" type="text" formControlName="from">
<label for="to">To:</label>
<input class="form-control" type="text" formControlName="to">
</div>
</div>
</div>
</div>
这是组件:
import { FormGroup, FormBuilder, FormArray, ControlContainer } from '@angular/forms';
import { Component, OnInit, Input } from '@angular/core';
import { ISection } from '../shared/practice.model';
@Component({
selector: '[formGroup] app-sections',
templateUrl: './sections.component.html',
styleUrls: ['./sections.component.scss']
})
export class SectionsComponent implements OnInit {
@Input() sections: ISection[];
saveForm: FormGroup;
get sectionsArr(): FormArray {
return this.saveForm.get('sections') as FormArray;
}
constructor(private formBuilder: FormBuilder, private controlContainer: ControlContainer) { }
ngOnInit() {
this.saveForm = this.controlContainer.control as FormGroup;
this.saveForm.addControl('sections', this.formBuilder.array([this.initSections()]));
this.sectionsArr.clear();
this.sections.forEach(s => {
this.sectionsArr.push(this.formBuilder.group({
from: s.from,
to: s.to
}));
});
}
initSections(): FormGroup {
return this.formBuilder.group({
from: [''],
to: ['']
});
}
addSection(): void {
this.sectionsArr.push(this.initSections());
}
}
事实证明,弗洛里安几乎做对了,正确的语法是:
<div *ngFor="let section of saveForm.get('sections')['controls']; let i=index" [formGroupName]="i">
这样,错误/警告就会消失,组件仍按预期工作。