将Angular表单控件分配给动态生成的对象数组

时间:2019-04-23 06:02:48

标签: angular angular4-forms

我现在有一个fromGroup,我想基于数据库值动态生成一些输入字段。示例:我有obj

{
    type:"text",
    name:"test_name"
    placeholder:"Test"
}

I have created input field like:

<input type="text" name="test_name" placeholder="Test">

到目前为止,我已经尝试过了,

将动态控件添加到我的FormGruop

this.applicationForm.addControl(formFieldObj.name, new FormControl('', Validators.required));

并将生成的HTML推送至模板,例如:

<div [innerHTML]="getDynamicHTML()"></div>

现在的问题是无法为任何此动态添加的输入字段添加值。我如何编译生成的HTML?

3 个答案:

答案 0 :(得分:1)

如您所见,Angular不会插值innerHTML内容。请参见here,因此该方法将行不通。

如果每个所需的输入字段都有一个对象数组,则应该可以使用ngFor遍历HTML中的数组,它可以动态创建所需的字段。

重新获取和设置值,如果采用上述方法,则可以在组件初始化时为数组中的每个字段添加一个表单控件。然后,可以在遍历模板时将它们分配给模板中的每个字段,以便为每个字段获取/设置一个值。

基本概念here-让我知道您的情况。在此示例中,我将字段控件直接添加到字段数据数组中,但是您可以创建一个新变量或使用字段组。

HTML:

<h2>Input Form:</h2>
<form>
    <div *ngFor="let field of fieldData">
        <label>{{field.name}}</label> 
        <input [formControl]="field.formControl" [placeholder]="field.placeholder" />
    </div>
</form>
<h2>Current Values:</h2>
<div *ngFor="let field of fieldData">
    <label>{{field.name}} value: </label> 
    <span>{{field.formControl.value}}</span>
</div>

TS:

fieldData = [{
    type:"text",
    name:"test_name_1",
    placeholder:"Test 1 Placeholder"
},
{
    type:"text",
    name:"test_name_2",
    placeholder:"Test 2 Placeholder"
}]

constructor(){
    for (let i = 0; i < this.fieldData.length; i++) { 
        this.fieldData[i]['formControl'] = new FormControl('');
    }
}

答案 1 :(得分:0)

看看form.setValue()form.patchValue()方法。使用后者,您可以在表单中部分设置值。

因此,如果您的对象具有动态生成的字段的值,则可以使用:


// sample object with values
formValues = {
    test_name: 'John',
    test_addr: 'London'
    ...
}

// this will setup values only for the form controls with matching keys in formValues
this.applicationForm.patchValue(formValues);

答案 2 :(得分:0)

您可以在初始化表单时设置一个值。

<form [formGroup]="form">
    <input type="text" formControlName="test_name" placeholder="Test" />
</form>

this.form = this.fb.group({
   test_name: ['Some value', Validators.required],
});
相关问题