所以,我有一個動態呈現幾部分組成,與此模板組件:角 - 等待,直到我裝模板之前接收數據
<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