2016-04-28 30 views
1

我在製作一個angular2應用程序。我最大的問題是無法推遲加載主要組件的依賴子組件,直到某些承諾得到解決。如何推遲主組件的依賴組件的初始化,以便可以解決某些承諾

我有app.component.ts,名爲AppComponent類,我在引導boot.ts這樣的:

bootstrap(AppComponent, [ROUTER_PROVIDERS, HTTP_PROVIDERS]); 

現在我想瀏覽到我的默認路由之前調用幾個非常重要的HTTP服務,即 - '/'。一個http服務將數據返回給我,用於在各種路線上進行SEO和設置元數據。

我知道任何類的構造函數都是在第一次調用的,但我不知道構造函數是否等待承諾解決。

回答

0

如果使用路由器可以使用CanActivate否則只是包裝的模板與*ngIf="dataArrived"

參見How to pass parameters rendered from backend to angular2 bootstrap method

+0

所以沒有辦法推遲子組件的負荷?我不確定* ngIf,因爲我認爲DomContentLoaded會在我進入路由後立即完成,因此在「dataArrived」之後更改元標記對於標題和描述等搜索引擎優化相關標記沒有任何好處。 –

+0

我不確定我是否理解你的評論。爲什麼你認爲如果meta標籤設置在激活路由之前或之後,或者爲什麼''ngIf''和'DomContentLoaded'是相關的,那麼它就很重要。 –

+0

在內容加載完畢後,谷歌機器人在特定推送狀態下抓取該頁面。我認爲* ngIf與DomContentLoaded無關,這就是爲什麼我擔心如果使用* ngIf不能解決我的問題。 –

0

你可以你的要求(S)完成(一個或多個)之後,非同步引導。下面是一個示例:

var app = platform(BROWSER_PROVIDERS) 
    .application([BROWSER_APP_PROVIDERS, appProviders]); 

var service = app.injector.get(CompaniesService); 

service.executeSomething().flatMap((data) => { 
    var companiesProvider = new Provider('data', { useValue: data }); 
    return app.bootstrap(appComponentType, [ companiesProvider ]); 
}).toPromise(); 

詳情請參閱此問題:

和相應的plunkr:https://plnkr.co/edit/ooMNzEw2ptWrumwAX5zP?p=preview

0

另一種解決方案是在構造函數中使用定時器:

setTimeout(() => { 
    call your function here 
}, 500);