我正在用反应形式构建角度为6的形式,并且我在每个部分使用组件,但我遇到一些问题: 我如何在父组件内的方法中在子组件中使用FormArray。 例如:
在父ts文件中:
constructor(private fb: FormBuilder,
private http: Http) { }
ngOnInit() {
this.parentForm = this.fb.group({
_server: this.fb.array([this.initItemRows()]),
})
}
initItemRows() {
return this.fb.group({
// DocumentID: uuid(),
HostName: [],
IPAddress: [],
Domain: [],
OS: []
});
}
get serverForms() {
return this.parentForm.get('_server') as FormArray
}
addServer() {
const server = this.fb.group({
// DocumentID: uuid(),
HostName: [],
IPAddress: [],
Domain: [],
OS: []
})
this.serverForms.push(server);
}
deleteServer(i) {
this.serverForms.removeAt(i)
}
在父HTML中,我有:
<div formArrayName="_server">
<table id="_server" class="table table-striped table-bordered">
<thead>
<tr>
<th>Host name</th>
<th>IP</th>
<th>Domain</th>
<th>OS</th>
<th>action</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let server of serverForms.controls; let i=index" [formGroupName]="i">
<td>
<input formControlName="HostName" class="form-control" type="text" />
</td>
<td>
<input formControlName="IPAddress" class="form-control" type="text" />
</td>
<td>
<input formControlName="Domain" class="form-control" type="text" />
</td>
<td>
<input formControlName="OS" class="form-control" type="text" />
</td>
<td class="buttonCenter">
<button mat-raised-button color="primary" class="deleteFieldButton" (click)="deleteServer(i)" type="button">delete</button>
</td>
</tr>
</tbody>
<button mat-raised-button color="primary" class="addFieldButton" (click)="addServer()" type="button">insert row</button>
</table>
</div>
但是我想使用父级(上面)的所有html代码放在子级组件中
<app-servers-section></app-servers-section>
我知道我可以在子组件内部使用FormGroupDirective,但是当我需要使用父方法时,它就无法工作。
请指教! 谢谢!
答案 0 :(得分:0)
您需要执行以下操作。
<app-servers-section (changeInChildForm)="doSomething($event)"></app-servers-section>
在子组件中要保留表单的位置,您需要从那里发出一个事件。
因此,在您的ChildComponent.ts中,将 EventEmitter 和 Output 与Component和其他内容一起导入
import { Component, EventEmitter, Input, Output } from '@angular/core';
在类的正文中,您可以执行类似的操作以发出要从子代传递给父代的事件。
@Output() changeInChildForm = new EventEmitter<boolean>();
somethingHappenedInChild(data: any) {
this.changeInChildForm.emit(data);
}
因此,当您想从子项中发出更改时,请调用子项组件的方法somethingHappenedInChild
。 changeInChildForm
将发出,它将调用Parent组件的方法doSomething($event)
。
我没有创建堆叠闪电战。但是,如果您需要更多与此相关的帮助,请像前面提到的那样创建一个堆叠闪电战。