Взгляните на этот Stackblitz, он упоминается в Angular документах и может служить образцом для того, чего вы пытаетесь достичь.
Вы должны изолировать каждый возможный тип вопроса, создав для каждого отдельного class
, чтобы вы могли формировать данные и затем использовать ngSwitch
для динамического создания HTML соответственно.
Базовый класс вопроса:
export class QuestionBase<T> {
controlType: string;
value: T;
key: string;
label: string;
// etc
constructor(options) {
// constructor logic
}
}
Какой-то специальный класс, который наследуется от базового класса
import { QuestionBase } from './question-base';
export class SpecialQuestion extends QuestionBase<string> {
controlType = 'specialQuestion';
type: string;
// special Question
specialValue: string;
constructor(options) {
super(options);
this.type = options['type'] || '';
}
}
Затем компонент вопроса:
<div [formGroup]="form">
<label>{{question.label}}</label>
<div [ngSwitch]="question.controlType">
// controls logic
<input *ngSwitchCase="'textbox'" >
<select *ngSwitchCase="'specialQuestion'"></select>
</div>
</div>
Затем вы добавляете это в компонент контейнера, где вы * l oop просматриваете весь массив вопросов.
Таким образом, ваш код будет пригоден для использования в будущем и будет использоваться повторно, когда вы добавите / измените функциональность своих форм в будущем. Вам не нужно будет создавать спагетти, чтобы удовлетворить требования крайнего случая, например, дополнительное поле ввода.