Il problema qui è che Angular2 non consente l'accesso al riferimento dell'applicazione e al relativo iniettore prima di avviare il componente principale su di esso. Vedere questa riga nel codice sorgente: https://github.com/angular/angular/blob/master/modules/angular2/platform/browser.ts#L110.
Un approccio potrebbe essere quello di implementare un bootstrap personalizzato invece di utilizzare quello predefinito. Qualcosa del genere che divide la creazione dell'applicazione e il booster sul componente dell'applicazione su di esso. In questo modo sarai in grado di caricare qualcosa tra le due attività.
Ecco un esempio di implementazione:
function customBoostrap(appComponentType, customProviders) {
reflector.reflectionCapabilities = new ReflectionCapabilities();
let appProviders =
isPresent(customProviders) ? [BROWSER_APP_PROVIDERS, customProviders] : BROWSER_APP_PROVIDERS;
var app = platform(BROWSER_PROVIDERS).application(appProviders);
var service = app.injector.get(CompaniesService);
return service.getCompanies().flatMap((companies) => {
var companiesProvider = new Provider('companies', { useValue: data });
return app.bootstrap(appComponentType, [ companiesProvider ]);
}).toPromise();
}
e usarlo in questo modo:
customBoostrap(AppComponent, [
HTTP_PROVIDERS,
CompaniesService
]);
aziende saranno automaticamente disponibili per l'iniezione all'interno del componente, ad esempio:
@Component({
(...)
})
export class AppComponent {
constructor(@Inject('companies') companies) {
console.log(companies);
}
}
Vedi questo corrispondente plunkr: https://plnkr.co/edit/RbBrQ7KOMoFVNU2ZG5jM?p=preview.
In questo momento, è un po 'hacky ma tale approccio potrebbe essere proposto come una richiesta di funzionalità ...
Modifica
Dopo aver dato un'occhiata al documento per la classe ApplicationRef
, ho visto che c'è una soluzione più semplice ;-)
var app = platform(BROWSER_PROVIDERS)
.application([BROWSER_APP_PROVIDERS, appProviders]);
service.getCompanies().flatMap((companies) => {
var companiesProvider = new Provider('companies', { useValue: data });
return app.bootstrap(appComponentType, [ companiesProvider ]);
}).toPromise();
Qui è corrispondente plunkr: https://plnkr.co/edit/ooMNzEw2ptWrumwAX5zP?p=preview.