我是Angular2的新手,在过去的几天里,我一直在尝试使用模型驱动的形式
创建可重复使用的形式组件所以可以说我们有一个组件componentA.component.ts
@Component({
selector: 'common-a',
template: `
<div [formGroup]="_metadataIdentifier">
<div class="form-group">
<label>Common A[1]</label>
<div>
<input type="text" formControlName="valueA1">
<small>Description 1</small>
</div>
<div class="form-group">
<label>Common A[2]</label>
<div>
<input type="text" formControlName="valueA2">
<small>Description 2</small>
</div>
</div>
`
})
export class ComponentA implements OnInit{
@Input('group')
public myForm: FormGroup;
constructor(private _fb: FormBuilder) {
}
ngOnInit() {
this.myForm = this._fb.group({
valueA1 : ['', [Validators.required]],
valueA2 : ['', [Validators.required]],
});
}
}
和一个组件B componentB.component.ts
@Component({
selector: 'common-b',
template: `
<div [formGroup]="_metadataIdentifier">
<div class="form-group">
<label>Common B</label>
<div>
<input type="text" formControlName="valueB">
<small>Description</small>
</div>
</div>
`
})
export class ComponentB implements OnInit{
@Input('group')
public myForm: FormGroup;
constructor(private _fb: FormBuilder) {
}
ngOnInit() {
this.myForm= this._fb.group({
valueB : ['', [Validators.required]]
});
}
}
我的问题是,如何使用这两个子组件组成表单,而不将输入的控制权移至主组件。例如main.component.ts
@Component({
selector: 'main',
template: `
<form [formGroup]="myForm" (ngSubmit)="onSubmit(myForm.value)">
<div>
<common-a [group]="formA"></common-a>
<common-b [group]="formB"></common-b>
<div>
<button>Register!</button>
</div>
</div>
</form>
`
})
export class Main implements OnInit{
@Input('group')
public myForm: FormGroup;
public formA : FormGroup;
public formB : FormGroup;
constructor(private _fb: FormBuilder) {
}
ngOnInit() {
this.myForm = this._fb.group({
//how can I compose these two sub forms here
//leaving the form control names agnostic to this component
});
}
}
这个想法背后的概念是建立许多共享其一些基础的复杂形式。
也就是说,我不希望我的Main
组件知道formControlNames
[valueA1
,valueA2
,valueB
]的名称,但可以自动插入它们并在顶级表单组上更新/validate。
任何想法或指向正确的方向都会有帮助。
这可以通过将我们的顶级FormGroup
传递给子组件,并使用formGroupName
使用CC_11将自己添加到更高的 CC_11关于较低级别的没有:
main.component.ts
template: `<...>
<common-a [parentForm]="myForm"></common-a>
<...>
我们还将摆脱forma,formb声明,因为它们不再使用。
component-a.component.ts [formGroup]
是我们的父组, formGroupName
是我们将如何识别并将组件的控件作为一个组作为一个组以在较大的整体中工作(它们会嵌套在父母内部组)。
@Component({<...>
template: `
<div [formGroup]="parentForm">
<div class="form-group">
<label>Common A[1]</label>
<div formGroupName="componentAForm">
<input type="text" formControlName="valueA1">
<small>Description 1</small>
</div>
<div class="form-group">
<label>Common A[2]</label>
<div formGroupName="componentAForm">
<input type="text" formControlName="valueA2">
<small>Description 2</small>
</div>
</div>`
})
export class ComponentA implements OnInit {
@Input() parentForm: FormGroup;
componentAForm: FormGroup;
constructor(private _fb: FormBuilder) {}
ngOnInit() {
this.componentAForm = this._fb.group({
valueA1: ['', Validators.required],
valueA2: ['', Validators.required]
});
this.parentForm.addControl("componentAForm", this.componentAForm);
}
}
这是一个plunker (请注意,我在这里使组件B更具动态性,以查看是否可以完成,但是上面的实现同样适用于b):http://http://http://plnkr.co/edit/fyp10d45pcqicdpnzm0u?p=preview