输入值未更新以显示保存在FormArray中的数据

时间:2019-07-18 12:07:41

标签: angular angular-reactive-forms

我的应用程序中有一个Angular反应形式,该形式利用FormArray在表单中存储值对。

OnInit,应用程序调用一个端点并返回存储在数据库中的一些值对,然后使用这些预先存在的值填充FormArray,以便在它们开始添加更多值之前向用户显示它们与表格配对。

FormArray会正确更新,如果我使用getRawValue记录FormGroup的值,我可以看到列表中的元素具有端点返回的值。因此,我的FormArray中的第一个元素具有其对的值。

窗体本身利用FormArray,以便用户可以根据需要添加或删除尽可能多的值对。因为数组的第一个元素已经填充了一个值对,所以用户看到的物理形式包含一对用于存储值的输入。但是,这些输入未使用存储在FormArray中的值填充。

即使FormArray包含数据,这似乎也要进行更新以显示输入元素,但不显示正在呈现的这些输入中的值。

我尝试使用setValuepatchValue方法,但似乎无法正常工作。我尝试使用它会产生TypeError: Cannot read property 'setValue' of null错误。

我需要怎么做才能更新表单中的输入,以便它们显示FormArray中包含的值?

组件

export class SettingsComponent implements OnInit, OnDestroy {

    ipRangeForm: FormGroup;

    constructor(
        private formBuilder: FormBuilder, private settingsService: SettingsService
    ) {
        super(baseService);
    }

    ngOnInit() {
        this.ipRangeForm = this.formBuilder.group(
            {
                ipRanges: this.formBuilder.array([])
            }
        );

        const stream = this.settingsService.getSettings();

        stream.subscribe(val => {
            this.ipRestrictionEnabled = val.ipRestrictionEnabled;
            for (const i of val.ipRanges) {
                console.log(i.startRange, i.endRange);
                console.log(this.ipRangeForm);
                this.addSpecifiedRange(i.startRange, i.endRange);
                this.ipRangeForm.controls['ipRanges'].get('startingRange').setValue(i.startRange); //This doesn't update anything, it actually produces a TypeError
            }
        });
    }

    getPageConfig() {
        return {
            pageKey: 'settings',
            displaySidebar: true,
            displayToolbar: true,
            backButtonRoute: ''
        };
    }

    get ipRangeForms() {
        return this.ipRangeForm.get('ipRanges') as FormArray;
    }

    addSpecifiedRange(startRange: string, endRange: string) {
        const ipRange = this.formBuilder.group({
            startingRange: [startRange],
            endingRange: [endRange]
        });

        this.ipRangeForms.push(ipRange);
        console.log(this.ipRangeForms.getRawValue());
    }

}

带有表单的模板

<form [formGroup]="ipRangeForm">
                    <div formArrayName="ipRanges">
                        <div *ngFor="let ranges of ipRangeForms.controls; let i=index" [formGroupName]="i">
                            <div class="row mb-lg">
                                <div class="col-6">
                                    <mat-card>
                                        <div class="row">
                                            <div class="col-5">

                                                <mat-form-field style="width: 100%;">
                                                    <label>
                                                        <input matInput value="" formControlName="startingRange"> <!-- These Inputs do not update to display the data held inside the form array -->
                                                    </label>
                                                </mat-form-field>

                                            </div>
                                            <div class="col-5">

                                                <mat-form-field style="width: 100%;">
                                                    <label>
                                                        <input matInput value="" formControlName="endingRange"> <!-- These Inputs do not update to display the data held inside the form array -->
                                                    </label>
                                                </mat-form-field>

                                            </div>
                                            <div class="col-2 remove-column">
                                                <button swui-core-button (click)="deleteRange(i)" class="mr-sm pd-zero"
                                                        color="secondary" buttonStyle="link">
                                                    {{ getTranslateKey('remove') | translate }}
                                                </button>
                                            </div>
                                        </div>
                                    </mat-card>
                                </div>
                            </div>
                        </div>
                    </div>
                </form>

0 个答案:

没有答案