找不到名称为的控件:
Cannot find control with name:
我有一个非常复杂的表单,我想将其分解成单独的组件。这是我的基本形式(仅采用示例字段),我正在使用 FormBuilder
:
ngOnInit() {
this.predictorQuestion = this.fb.group({
question: ['', Validators.required],
options: this.fb.array([
this.fb.control('', Validators.required),
]),
meta_options: this.fb.group({
test_type: ['', Validators.required],
})
});
get meta_options() {
return this.predictorQuestion.get('meta_options') as FormGroup;
}
get options() {
return this.predictorQuestion.get('options') as FormArray;
}
如果我尝试将它连接到我的模板,它会完美运行:
<form [formGroup]="predictorQuestion" fxLayout="column">
<mat-form-field fxFlex appearance="outline">
<mat-label>Question</mat-label>
<input matInput formControlName="question">
</mat-form-field>
<div fxLayoutAlign="space-between center">
<h3>Options</h3>
<button (click)="addOption()" matTooltip="Add option" matTooltipPosition="right" mat-mini-fab type="button">
<mat-icon>add</mat-icon>
</button>
</div>
<div formArrayName="options" fxLayout="column">
<div *ngFor="let answer of options.controls; let i = index" fxLayout="row" fxLayoutAlign="space-between stretch">
<mat-form-field appearance="outline" fxFlex>
<mat-label>Option {{ i+1 }} </mat-label>
<input fxFlex matInput [formControlName]="i">
</mat-form-field>
<button mat-icon-button matTooltip="Remove this option" matTooltipPosition="right" (click)="removeOption(i)">
<mat-icon>close</mat-icon>
</button>
</div>
</div>
<div formGroupName="meta_options" fxLayoutAlign="space-between" fxLayoutGap="20px" fxLayout="column">
<mat-form-field fxFlex="25">
<mat-select formControlName="test_type">
<mat-option *ngFor="let vtype of vtypes" value="{{ vtype.value }}">{{ vtype.name }}</mat-option>
</mat-select>
</mat-form-field>
</div>
</form>
这呈现没有任何错误。
如果我尝试以如下方式将 meta_options.test_type
分解为它自己的组件:
component.ts
@Input() parent_form: FormGroup;
public vtypes: Array<Object>;
constructor(private fb: FormBuilder) {
this.vtypes = [
{
name: 'Timestamp',
value: 'timestamp'
},
{
name: 'Over',
value: 'over'
}
];
}
component.html
<mat-form-field fxFlex="25" [formGroup]="parent_form">
<mat-select formControlName="test_type">
<mat-option *ngFor="let vtype of vtypes" value="{{ vtype.value }}">{{ vtype.name }}</mat-option>
</mat-select>
</mat-form-field>
并在我的主要父表单中使用此组件作为
<meta-option-value [parent_form]="predictorQuestion"></meta-option-value>
我收到以下错误:
"Cannot find the control with the name: 'test_type'"
我在这里错过了什么?
传递 "control" 本身并在 children
中使用 [FormControl]
<meta-option-value [formControl]="predictorQuestion.get('meta_options')">
</meta-option-value>
你的meta-options
<mat-form-field fxFlex="25" [formControl]="formControl">
...
</mat-form-field>
//and add the Input
@Input()formControl: FormControl;
如果您需要传递 FormGroup 或 Form Array,同样的想法可行
您正在将完整的 FormGroup (predictorQuestion)
传递给 child。您只需要将 predictorQuestion.get('meta_types')
作为 [parent_form]="predictorQuestion.get('meta_types')"
.
传递给 parent_form
您可以通过定义 viewProviders
:
说您的子组件根据父容器使用 formControlName="test_type"
而不管容器的类型(FormGroupName、FormGroup 或 FormArray)
元选项-value.component.ts
@Component({
selector: 'meta-option-value',
template: `
<mat-form-field fxFlex="25">
<mat-select formControlName="test_type">
<mat-option ...>{{ vtype.name }}</mat-option>
</mat-select>
</mat-form-field>
`,
viewProviders: [{
provide: ControlContainer,
useFactory: (container: ControlContainer) => container,
deps: [[new SkipSelf(), ControlContainer]],
}]
})
export class MetaOptionValueComponent {
...
}
parent.template.html
<div formGroupName="meta_options">
/\
||
will look at this group
<meta-option-value></meta-option-value>
</div>
如您所见,MetaOptionValueComponent 仅包含其自身的相关逻辑。
另请参阅:
- Angular2 nested template driven form
当然,另一种方法是传递 FormGroup 或 FormControl 实例,并按照其他答案中的建议直接使用它
我有一个非常复杂的表单,我想将其分解成单独的组件。这是我的基本形式(仅采用示例字段),我正在使用 FormBuilder
:
ngOnInit() {
this.predictorQuestion = this.fb.group({
question: ['', Validators.required],
options: this.fb.array([
this.fb.control('', Validators.required),
]),
meta_options: this.fb.group({
test_type: ['', Validators.required],
})
});
get meta_options() {
return this.predictorQuestion.get('meta_options') as FormGroup;
}
get options() {
return this.predictorQuestion.get('options') as FormArray;
}
如果我尝试将它连接到我的模板,它会完美运行:
<form [formGroup]="predictorQuestion" fxLayout="column">
<mat-form-field fxFlex appearance="outline">
<mat-label>Question</mat-label>
<input matInput formControlName="question">
</mat-form-field>
<div fxLayoutAlign="space-between center">
<h3>Options</h3>
<button (click)="addOption()" matTooltip="Add option" matTooltipPosition="right" mat-mini-fab type="button">
<mat-icon>add</mat-icon>
</button>
</div>
<div formArrayName="options" fxLayout="column">
<div *ngFor="let answer of options.controls; let i = index" fxLayout="row" fxLayoutAlign="space-between stretch">
<mat-form-field appearance="outline" fxFlex>
<mat-label>Option {{ i+1 }} </mat-label>
<input fxFlex matInput [formControlName]="i">
</mat-form-field>
<button mat-icon-button matTooltip="Remove this option" matTooltipPosition="right" (click)="removeOption(i)">
<mat-icon>close</mat-icon>
</button>
</div>
</div>
<div formGroupName="meta_options" fxLayoutAlign="space-between" fxLayoutGap="20px" fxLayout="column">
<mat-form-field fxFlex="25">
<mat-select formControlName="test_type">
<mat-option *ngFor="let vtype of vtypes" value="{{ vtype.value }}">{{ vtype.name }}</mat-option>
</mat-select>
</mat-form-field>
</div>
</form>
这呈现没有任何错误。
如果我尝试以如下方式将 meta_options.test_type
分解为它自己的组件:
component.ts
@Input() parent_form: FormGroup;
public vtypes: Array<Object>;
constructor(private fb: FormBuilder) {
this.vtypes = [
{
name: 'Timestamp',
value: 'timestamp'
},
{
name: 'Over',
value: 'over'
}
];
}
component.html
<mat-form-field fxFlex="25" [formGroup]="parent_form">
<mat-select formControlName="test_type">
<mat-option *ngFor="let vtype of vtypes" value="{{ vtype.value }}">{{ vtype.name }}</mat-option>
</mat-select>
</mat-form-field>
并在我的主要父表单中使用此组件作为
<meta-option-value [parent_form]="predictorQuestion"></meta-option-value>
我收到以下错误:
"Cannot find the control with the name: 'test_type'"
我在这里错过了什么?
传递 "control" 本身并在 children
中使用 [FormControl]<meta-option-value [formControl]="predictorQuestion.get('meta_options')">
</meta-option-value>
你的meta-options
<mat-form-field fxFlex="25" [formControl]="formControl">
...
</mat-form-field>
//and add the Input
@Input()formControl: FormControl;
如果您需要传递 FormGroup 或 Form Array,同样的想法可行
您正在将完整的 FormGroup (predictorQuestion)
传递给 child。您只需要将 predictorQuestion.get('meta_types')
作为 [parent_form]="predictorQuestion.get('meta_types')"
.
parent_form
您可以通过定义 viewProviders
:
formControlName="test_type"
而不管容器的类型(FormGroupName、FormGroup 或 FormArray)
元选项-value.component.ts
@Component({
selector: 'meta-option-value',
template: `
<mat-form-field fxFlex="25">
<mat-select formControlName="test_type">
<mat-option ...>{{ vtype.name }}</mat-option>
</mat-select>
</mat-form-field>
`,
viewProviders: [{
provide: ControlContainer,
useFactory: (container: ControlContainer) => container,
deps: [[new SkipSelf(), ControlContainer]],
}]
})
export class MetaOptionValueComponent {
...
}
parent.template.html
<div formGroupName="meta_options">
/\
||
will look at this group
<meta-option-value></meta-option-value>
</div>
如您所见,MetaOptionValueComponent 仅包含其自身的相关逻辑。
另请参阅:
- Angular2 nested template driven form
当然,另一种方法是传递 FormGroup 或 FormControl 实例,并按照其他答案中的建议直接使用它