我有一个组件,可以动态呈现多个组件,使用以下模板:
<div [saJquiAccordion]="{active: group.value['collapsed']}" *ngFor="let group of filterGroupsTemplate | keysCheckDisplay;">
<div>
<h4>{{group.key | i18n}}</h4>
<form id="ibo-{{group.key}}" class="form-horizontal" autocomplete="off" style="overflow: initial">
<fieldset *ngFor="let field of group.value | keys">
<ng-container *ngComponentOutlet="fieldSets[field.value.template];
ngModuleFactory: smartadminFormsModule;"></ng-container>
</fieldset>
</form>
</div>
</div>
问题是,填充这些组件所需的数据我是通过API调用获得的:
this.getFiltersSubscription = this.getFilters().subscribe(
(filters) => {
this.filters = filters;
log.info('API CALL. getting filters');
// Sending data to fieldform components
this.iboService.updateIBOsRankList(filters['iboRank'].data);
this.iboService.updateIBOsNewsletterOptions(filters['iboNewsletter'].data);
this.iboService.updateIBOsTotalOrders(filters['iboTotalOrders'].data);
}
);
所以,一旦我有了数据,我就会触发一个服务,我的组件订阅了这个服务,然后它们就会处理收集到的数据.
PROBLEM
如果API调用是在所有组件加载之前进行的,我将触发这些传递数据的服务方法,但没有人订阅这些可观察的服务.
一种方法是:
首先加载数据,只有当我加载了数据时,我才会呈现模板,因此,动态呈现所有这些组件,然后我才会触发这些服务方法(可观察的).
我不想对每个组件进行API调用,因为它可以是60个组件,我会对代码进行松散的抽象,但我更喜欢这样做:
// Listens to field's init and creates the fieldset triggering a service call that will be listened by the field component
this.iboService.initIBOsFilters$.subscribe(
(fieldName) => {
if (fieldName === 'IBOsRankSelectorFieldComponent') {
log.data('inside initIBOsFilters$ subscription, calling updateIBOsFilters()', fieldName);
this.iboService.updateIBOsRankList(this.filters['iboRank'].data); // HERE I'M PASSING DATA TO THE COMPONENT RENDERED DYNAMICALY. BUT IF this.filters IS UNDEFINED, IT BREAKS
}
}
);
为了做到这一点,我需要确保定义this.filters
,因此,我得出结论:
在呈现模板html之前,如何等待API调用结束并定义this.filters
?
对不起,如果我的问题有点长,如果你需要更多的细节,请告诉我.
谢谢