Проблема со строками DOM заключается в том, что даже если они отображаются браузером, Angular не видит их как часть шаблона для привязки вида.Наилучший подход к этой проблеме - использовать массив, который определяет, как шаблон должен отображаться следующим образом:
createQuestion(question: string) {
const template = question.match(/[A-Za-z]+|{\d}/g) // <-- [ 'The', '{0}', '{1}', '{2}', 'his', '{3}', 'off' ]
.map(match => match[0] === '{' ? { type: 'input', value: ''}
: { type: 'string', value: match })
return template;
}
Метод createQuestion
принимает строку шаблона и использует регулярное выражение для разбиения его на части.в форме [ 'The', '{0}', '{1}', '{2}', 'his', '{3}', 'off' ]
, которую я затем передаю в метод карты, который генерирует единый объект для каждой части.Любая часть, имеющая строку '{', считается заполнителем для ввода, поэтому она превращается в форму { type: 'input', value: '' }
, любой текст превращается в форму { type: 'text', value: 'text value here' }
, так что мы позже сможем перебрать этот массив и использовать * ngIf.для условного рендеринга либо текста, либо ввода.
Это шаблон, созданный для предоставленной вами примерной строки.
template = [
{ type: 'text', value: 'The' },
{ type: 'input', value: '' }
{ type: 'input', value: '' }
{ type: 'input', value: '' }
{ type: 'text', value: 'his' }
{ type: 'input', value: '' }
{ type: 'text', value: 'off' }
]
С помощью этого шаблона вы можете создать угловой шаблон со значением, напримерИтак,
<div *ngFor="let template of questionsArray.map(q => createQuestion(q))">
---- some stuff ----
<div *ngFor="let section of template">
<input *ngIf="section.type === 'input'" ([ngModel])="section.value" />
<span *ngIf="section.type === 'text'">{{ section.value }}</span>
</div>
---- some stuff ----
</div>
Внешняя директива *ngFor
проходит через все различные вопросы, которые были преобразованы в шаблоны с помощью .map(q => createQuestion(q))
.Внутренняя директива *ngFor
проходит по каждой секции шаблона и генерирует либо span
, либо input
на основе свойства type
каждого раздела.Если тип text
, отображается диапазон.Если тип input
и ввод отображается с привязкой ngModel к свойству value
.