这里的问题是 Angular2 在引导主要组件之前不允许您访问应用程序引用及其注入器。在源代码中看到这一行:https://github.com/angular/angular/blob/master/modules/angular2/platform/browser.ts#L110。
一种方法可以是实现自定义引导而不是使用默认引导。类似的东西将应用程序的创建和应用程序组件的提升分开。这样你就可以在两个任务之间加载一些东西。
这是一个示例实现:
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();
}
并以这种方式使用它:
customBoostrap(AppComponent, [
HTTP_PROVIDERS,
CompaniesService
]);
公司将自动在组件内进行注入,例如:
@Component({
(...)
})
export class AppComponent {
constructor(@Inject('companies') companies) {
console.log(companies);
}
}
查看相应的 plunkr:https://plnkr.co/edit/RbBrQ7KOMoFVNU2ZG5jM?p=preview。
目前,它有点 hacky,但这种方法可以作为功能请求提出......
编辑
查看ApplicationRef 类的文档后,我发现有一个更简单的解决方案;-)
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();
这里是对应的 plunkr:https://plnkr.co/edit/ooMNzEw2ptWrumwAX5zP?p=preview。