我正在尝试根据来自http服务的输入加载动态字段表单(它应该提供要加载哪些字段的元数据以及字段的名称和类型等)。因此,一旦我收到带有元数据形式的http响应,我必须在 ngOnInit()中动态构建formGroup。
当我对这个元数据对象进行硬编码并从数据服务返回Observable时,该组件会在 ngOnInt 中动态构建表单,但是只要我移动调用在http服务生活的数据服务,页面加载似乎发生在http调用响应之前,因此表单不加载字段。 我首先在控制台上收到以下错误:
ERROR Error: formGroup expects a FormGroup instance. Please pass one in.
我观察到最终http-call会响应(比如11毫秒)并且基于.subscribe函数创建了formGroup(现在没有用,因为页面在没有任何字段的情况下呈现为空白)。
formGroup = {};
data:Array<FormField>;
form: FormGroup;
ngOnInit() {
// dis --> is the data service
this.dis.getFieldsData().subscribe(respose=>{
this.data=respose;
this.objectProps =
Object.values(this.data)
.map(prop => {
return Object.assign({},{key:prop.name}, prop);
});
for(let prop of Object.values(this.objectProps)) {
this.formGroup[prop.name] = new FormControl(prop || '',
this.mapValidators(prop.validation));
} //below is where the form is assigned the dynamically built formGroup
this.form = new FormGroup(this.formGroup);
});
}
答案 0 :(得分:1)
您可以使用类似isFormReady
布尔变量的内容。所以在你的html中放置*ngIf="isFormReady"
然后在你的组件中
this.form = new FormGroup(this.formGroup);
this.isFormReady = true;
答案 1 :(得分:0)
您可以在init:FormGroup
this.form = new FormGroup({});
然后在事件传递时使用控件动态填充此表单:
this.form.addControl('some-key', new FormControl(''));