Страница изначально была написана как форма, управляемая шаблоном, но сейчас преобразуется в реактивную, чтобы добавить функцию автосохранения.
В конструкторе компонента страницы я определяю переменную реактивной формы:
this.form = fb.group({
reviewer: '',
position: '',
officeName: '',
rows: fb.array([]),
comments1: '',
comments2: '',
comments3: ''
});
«строки» - это поле, имеющее отношение к этой проблеме.
В ngInit через веб-API выполняется запрос на получение сохраненных данных формы. Данные извлекаются как массив строк, каждая из которых содержит массив из 6 ячеек. Третья ячейка будет привязана к FormControl, остальные будут отображаться как статический текст.
this.rows = summaryReportQuestion.map(summaryReportQuestionObj => {
return {
cells: [
summaryReportQuestionObj.questionID,
summaryReportQuestionObj.question,
(summaryReportQuestionObj.columnSign == '$' ? (summaryReportQuestionObj.columnSign + ' ' + summaryReportQuestionObj.target) : summaryReportQuestionObj.target + ' ' + summaryReportQuestionObj.columnSign),
(summaryReportQuestionObj.budget == null ? summaryReportQuestionObj.budget : (summaryReportQuestionObj.columnSign == '$' ? summaryReportQuestionObj.columnSign + ' ' + this.utilityService.formatNumberWithCommas(Math.floor(summaryReportQuestionObj.budget), false) : summaryReportQuestionObj.budget + ' ' + summaryReportQuestionObj.columnSign)),
(summaryReportQuestionObj.average == null ? summaryReportQuestionObj.average : (summaryReportQuestionObj.columnSign == '$' ? summaryReportQuestionObj.columnSign + ' ' + this.utilityService.formatNumberWithCommas(Math.floor(summaryReportQuestionObj.average), false) : summaryReportQuestionObj.average + ' ' + summaryReportQuestionObj.columnSign)),
(summaryReportQuestionObj.top20Percent == null ? summaryReportQuestionObj.top20Percent : (summaryReportQuestionObj.columnSign == '$' ? summaryReportQuestionObj.columnSign + ' ' + this.utilityService.formatNumberWithCommas(Math.floor(summaryReportQuestionObj.top20Percent), false) : summaryReportQuestionObj.top20Percent + ' ' + summaryReportQuestionObj.columnSign))
]
};
});
let faRows = new FormArray([]);
for (var i = 0, len = this.rows.length; i < len; i++) {
let row = this.rows[i].cells;
for (var j = 0, length = this.rows[i].cells.length; j < length; j++) {
let fc = new FormControl(this.rows[i].cells[j]);
faRows.push(fc);
}
}
// this.form.setValue({rows: faRows});
// this.form.setControl('rows', faRows);
В HTML:
<tbody>
<tr *ngFor="let row of rows;let r = index" [attr.data-index]="r">
<ng-container>
<td *ngFor="let cell of row.cells;let i = index" [attr.data-index]="i">
<span *ngIf="i != 2">{{cell}}</span>
<!-- <input type="text" formControlName="form.rows[r]" *ngIf="i == 2"> -->
</td>
</ng-container>
</tr>
</tbody>
На основе комментария и ответа я разъяснил свое намерение и код. [спасибо @amal и @DeborahK] Сейчас я привязываю только одну ячейку данных из каждой строки к FormControl, а остальные ячейки в каждой строке отображаются с помощью: {{cell}}
Поэтому мне нужно отобразить содержимое this.rows (как показано в html), а также this.form.rows.
В настоящее время у меня возникают две проблемы с пониманием того, как это сделать. В машинописном тексте, оставляя последний блок циклов, повторяющих строки данных, которые создают строки, FormControls массив faRows содержит именно то, что я ожидал, FormArray из FormControls, и каждый из них получил правильное связанное сохраненное значение. Но при попытке скопировать данные из this.rows для создания FormControls для form.rows я не могу заставить setValue или setControl работать правильно. Это может быть связано с наименованием FormControl на странице html, что является моей второй проблемой.
Я не понимаю, как ссылаться на переменную формы для динамического создания formControlName в html. Это то, что я себе представляю, но это не работает.
<input type="text" formControlName="form.rows[r]" *ngIf="i == 2">