#javascript #angular #typescript
#javascript #угловатый #машинописный текст
Вопрос:
У меня есть строка, которая содержит форму, которую я хочу динамически отображать.
Когда пользователь нажимает «Добавить шаг», строка моего шаблона добавляется в список и отображается с ngFor
помощью . Проблема в том, что входные данные не отображаются, только <h3>
тег.
Перед нажатием кнопки:
После — ввод не отображается ни на экране, ни в html:
тс:
scenarioTemplate = `
<div id="content">
<h3>Name</h3>
<input name="{{i}}" [ngModel]="i">
</div>`;
steps = [];
addScenarioStep() {
this.steps.push(this.scenarioTemplate);
}
HTML:
<form #myForm="ngForm">
<fieldset ngModelGroup="inputs" #inputs="ngModelGroup">
<ng-container *ngFor="let step of steps; let i = index">
<div [innerHTML]=step attr.stepId="{{i}}"></div>
</ng-container>
</fieldset>
</form>
<button id="addStepBtn" type="button" class="btn btn-light" (click)="addScenarioStep()">Add Scenario Step </button>
Комментарии:
1. Синтаксис Angular
{{i}}
и[ngModel]
не будет учитываться при визуализации с[innerHTML]
привязкой. Есть ли причина вставлять шаблон с[innerHTML]
вместо того, чтобы помещать эту разметку в шаблон компонента? Кстати, вы можете предпочесть этот синтаксис привязки для атрибута:[attr.stepId]="i"
.2. @ConnorsFan Ваш комментарий может быть ответом. Кажется, это вопрос XY — просто неправильный инструмент для работы
Ответ №1:
- Положите все это дело целиком
<div id="content">
<h3>Name</h3>
<input name="{{i}}" [ngModel]="i">
</div>
в шаблоне, а не в TS.
- Не изменяйте массив. Вместо того , чтобы
this.steps.push(newElem);
делать
this.steps = [...this.steps, newElem];
Комментарии:
1. Мне нужно добавить новые элементы формы во время выполнения, я не смогу этого сделать, если не изменю массив
2.
this.steps = [...this.steps, newElem]
создает новый массив с включенными старыми и новыми элементами и запускает обнаружение изменений, в то время как изменение массива этого не делает.3. Ах, извините — я неправильно понял, постараюсь в ближайшее время