所以,我有一个动态呈现几部分组成,与此模板组件:角 - 等待,直到我装模板之前接收数据
<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);
}
);
所以,一旦我有我的数据,我触发服务可观察这我部件SUBSCR与相似,然后他们将处理收集的数据。
问题:
如果API调用的所有组件加载之前提出的,我会触发这些服务方式传递数据,但没有人会被订阅的观测量。
的方法是:
加载数据第一,只有当我有加载的数据,我会呈现模板,因此,动态地呈现所有这些组件,然后才我会触发这些服务方法(Observables)。
我不想让API调用的每个组件,因为它可以像60级的部件,我会相当松散的抽象FO代码,但我preffer做这样的事情:
// 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
定义,因此,我得出的结论是:
我怎么能等到API调用结束,this.filters
被渲染我的HTML模板之前定义的?
对不起,如果我的问题有点长,如果你需要更多的细节只是让我知道。
谢谢!
请尝试我在异步管https://angular.io/api/common/AsyncPipe – Gary
@Gary看看。但是,你可以发表一个例子吗?例如,我在'ngFor'中多次使用'async'管道。但是我从来没有使用异步管道,但没有呈现可观察的。我没有渲染'过滤器'也没有*打印*它,我只需要等到它被定义为加载整个模板。 – SrAxi
难道你不能只是添加一个'* ngIf = filters'来阻止模板渲染,直到'filters'被填充? – Saravana