如何确保在 angular 中呈现响应式表单之前加载可观察数据
How to ensure load observable data before rendering reactive form in angular
我正在研究 Angular 5 应用程序中的响应式表单组。我通过 API 获取订阅了 observable 的数据。我的问题是我的 formGroup 在不存在时尝试加载数据并抛出异常。我需要确保 loadData() 在 formGroup 初始化之前加载数据。
组件
export class QuestionsComponent implements OnInit {
@Input() questions: QuestionBase<any>[] = [];
@Input() questionsList: QuestionBase<any>[] = [];
@Input() questionsMappedList: QuestionBase<any>[] = [];
form: FormGroup;
private view: BehaviorSubject<QuestionsDataModel>;
private consultationQuestions: QuestionsDataModel;
constructor(private dataService: QuestionsDataService, private router: Router, private session: SessionStorageService, private qcs: QuestionControlService, private questionService: QuestionMappingService) {
}
ngOnInit(): void {
this.view = new BehaviorSubject<QuestionsDataModel>(null);
this.loadData();
this.questions = this.questionService.getQuestions();
//this.questions = this.questionService.getQuestionList(null);
this.form = this.qcs.toFormGroup(this.questions);
}
public loadData():void
{
//filtersLoaded: Promise<boolean>;
var consultationId = this.session.getItem('consultationId');
this.dataService.getQuestions(consultationId)
.subscribe(data =>{
debugger;
this.view.next(data);
this.questionsList = this.questionService.getQuestionList(data);
console.log("dynamic questionsList...", this.questionsList);
});
}
模板
<div>
<form (ngSubmit)="onSubmit()" [formGroup]="form">
<div *ngFor="let question of questions" class="form-row">
<app-question [question]="question" [form]="form"></app-question>
</div>
<div class="form-row">
<button type="submit" [disabled]="!form.valid">Save</button>
</div>
</form>
<div *ngIf="payLoad" class="form-row">
<strong>Saved the following values</strong><br>{{payLoad}}
</div>
</div>
您应该在 ngOnInit
中初始化表单,然后在 API 调用后更新其值。
ngOnInit(): void {
this.view = new BehaviorSubject<QuestionsDataModel>(null);
this.loadData();
this.questions = this.questionService.getQuestions();
this.form = this.formBuilder.group({
sampleProperty: '',
// init form values
});
}
public loadData(): void {
var consultationId = this.session.getItem('consultationId');
this.dataService.getQuestions(consultationId)
.subscribe(data =>{
debugger;
this.view.next(data);
this.questionsList = this.questionService.getQuestionList(data);
this.form = this.qcs.toFormGroup(this.questions);
});
}
在 ngOnInit 上添加布尔条件..
private formData = false;
然后在您的 loadData 函数中执行...
loadData() {
this.formData = true;
然后在你的模板中做..
<form *nGIf='formData'>
或者干脆做..
<form *nGIf='myFormDataVariables' >
我正在研究 Angular 5 应用程序中的响应式表单组。我通过 API 获取订阅了 observable 的数据。我的问题是我的 formGroup 在不存在时尝试加载数据并抛出异常。我需要确保 loadData() 在 formGroup 初始化之前加载数据。
组件
export class QuestionsComponent implements OnInit {
@Input() questions: QuestionBase<any>[] = [];
@Input() questionsList: QuestionBase<any>[] = [];
@Input() questionsMappedList: QuestionBase<any>[] = [];
form: FormGroup;
private view: BehaviorSubject<QuestionsDataModel>;
private consultationQuestions: QuestionsDataModel;
constructor(private dataService: QuestionsDataService, private router: Router, private session: SessionStorageService, private qcs: QuestionControlService, private questionService: QuestionMappingService) {
}
ngOnInit(): void {
this.view = new BehaviorSubject<QuestionsDataModel>(null);
this.loadData();
this.questions = this.questionService.getQuestions();
//this.questions = this.questionService.getQuestionList(null);
this.form = this.qcs.toFormGroup(this.questions);
}
public loadData():void
{
//filtersLoaded: Promise<boolean>;
var consultationId = this.session.getItem('consultationId');
this.dataService.getQuestions(consultationId)
.subscribe(data =>{
debugger;
this.view.next(data);
this.questionsList = this.questionService.getQuestionList(data);
console.log("dynamic questionsList...", this.questionsList);
});
}
模板
<div>
<form (ngSubmit)="onSubmit()" [formGroup]="form">
<div *ngFor="let question of questions" class="form-row">
<app-question [question]="question" [form]="form"></app-question>
</div>
<div class="form-row">
<button type="submit" [disabled]="!form.valid">Save</button>
</div>
</form>
<div *ngIf="payLoad" class="form-row">
<strong>Saved the following values</strong><br>{{payLoad}}
</div>
</div>
您应该在 ngOnInit
中初始化表单,然后在 API 调用后更新其值。
ngOnInit(): void {
this.view = new BehaviorSubject<QuestionsDataModel>(null);
this.loadData();
this.questions = this.questionService.getQuestions();
this.form = this.formBuilder.group({
sampleProperty: '',
// init form values
});
}
public loadData(): void {
var consultationId = this.session.getItem('consultationId');
this.dataService.getQuestions(consultationId)
.subscribe(data =>{
debugger;
this.view.next(data);
this.questionsList = this.questionService.getQuestionList(data);
this.form = this.qcs.toFormGroup(this.questions);
});
}
在 ngOnInit 上添加布尔条件..
private formData = false;
然后在您的 loadData 函数中执行...
loadData() {
this.formData = true;
然后在你的模板中做..
<form *nGIf='formData'>
或者干脆做..
<form *nGIf='myFormDataVariables' >