Чтобы быть очень кратким, я использую этот Plunker. У меня есть сценарий, в котором я должен создать управляет динамически, считывая данные элементов из службы. Поэтому, когда я читаю данные из службы, они асинхронны. Но мне нужно создать некоторые конкретные объекты на основе данных, которые я получаю от службы, и передать их дочерним компонентам. Итак, вот моя логика
Html для основного компонента показан ниже.
<ion-content padding class="container" *ngIf="questions">
<app-dynamic-form [questions]="questions"></app-dynamic-form>
</ion-content>
Класс для основного компонента ниже
Class ComponentMain{
@Input() questions: QuestionBase<any>[]=[];
constructor(public navCtrl: NavController, public navParams: NavParams,private qcs: Service)
{
qcs.getQuestions(this.parameter1.$key).subscribe(result => this.questions = result);
}
}
HTML-код дочерних компонентов выглядит следующим образом.
<div *ngIf="form">
<form (ngSubmit)="onSubmit()" [formGroup]="form">
<div *ngFor="let question of questions" class="form-row">
<div *ngIf="question">
<app-question [question]="question" [form]="form"></app-question>
</div>
</div>
</form>
</div>
Дочерний компонент выглядит следующим образом
Class ChildComponent implements AfterViewInit {
@Input() questions: QuestionBase<any>[] = [];
Constructor(){
}
ngAfterViewInit(){
this.form = this.qcs.toFormGroup(this.questions);
}
}
Существует второй дочерний компонент, который зависит от дочернего компонента для создания элементов управления. Таким образом, элементы управления заполняются только в ngOnit второго дочернего компонента, из-за чего элементы управления не создаются. Я пытался использовать множество хуков жизненного цикла, таких как OnInit, OnChanges и т. д. Но ни один из них не дал мне результата. Я уверен, что упускаю что-то, что я не могу понять.
Class Service(){
questions: QuestionsData<any>[]=[];
getQuestions(FormKey: string) {
var dbQuestions = this.af.list('/elements', {
query: {
limitToLast: 200,
orderByChild: 'formid',
equalTo: FormKey
}
})
dbQuestions.subscribe(snapshots=>{
snapshots.forEach(elementData => {
this.questions.push(new TextboxQuestion({
key: elementData.elementname,
label: elementData.displaytext,
value: elementData.elementvalue,
required: false,
order: elementData.sortorder
}))
}
}
}