import {Component, ComponentFactoryResolver, Input, OnInit, ViewChild} from '@angular/core'; import {IQuestionItem} from './question-item.component'; import {QuestionBuilderDirective} from './question-builder.directive'; import {IQuestionBuilder} from './question-builder.model'; import {BehaviorSubject} from 'rxjs'; import {QuestionBuilderService} from './question-builder.service'; import {IElements} from '../../models/elements.model'; @Component({ selector: 'ngs-question-builder-component', template: `
`, styles: [] }) export class QuestionBuilderComponent implements OnInit { hasQuestion = false; question: IQuestionItem; @Input() element: IElements; @Input() surveyId: string; @Input() isView: boolean; // initialize a private variable _questions as a BehaviorSubject private _questionType = new BehaviorSubject(null); // change questions to use getter and setter @Input() set questionType(value) { // set the latest value for _questions BehaviorSubject this._questionType.next(value); } get questionType() { // get the latest value from _questions BehaviorSubject return this._questionType.getValue(); } @ViewChild(QuestionBuilderDirective) questionBuilderHost: QuestionBuilderDirective; constructor(private componentFactoryResolver: ComponentFactoryResolver, private questionBuilder$: QuestionBuilderService) { } ngOnInit() { this._questionType.subscribe((payload: string) => { if (!!payload) { this.hasQuestion = true; setTimeout(() => { this.question = this.questionBuilder$.getElementTypeComponent(payload, this.element, this.surveyId, this.isView); this.loadComponent(); }, 300); } else { this.hasQuestion = false; } }); } loadComponent() { const questionItem = this.question; const componentFactory = this.componentFactoryResolver.resolveComponentFactory( questionItem.component ); const viewContainerRef = this.questionBuilderHost.viewContainerRef; viewContainerRef.clear(); const componentRef = viewContainerRef.createComponent(componentFactory); if (!!questionItem.data) { (componentRef.instance).data = questionItem.data; } } }