StaticInjector
应该是替代品ReflectiveInjector
这不需要Reflect
API. getAnnotations
是低级黑客,它可能无法使用StaticInjector
在目前的状态下。还,getAnnotations
在设计上与 AOT 不兼容。
最好按照框架应该完成的方式为模块创建注入器,即应该引导模块。由于没有要引导的组件,ngDoBootstrap
应指定挂钩。
默认情况下,引导进程是异步的。如果这不是问题,则可以链接初始化 Promise 来获取模块实例。
An example:
@NgModule({
imports: [BrowserModule, HttpClientModule]
})
export class MyHttpModule {
static httpClient?: HttpClient;
httpClient?: HttpClient;
constructor(private _injector: Injector) {}
ngDoBootstrap() {
MyHttpModule.httpClient = this.httpClient = this._injector.get(HttpClient);
}
}
platformBrowserDynamic().bootstrapModule(MyHttpModule)
.then((myHttpModule: NgModuleRef<MyHttpModule>) => {
// HttpClient instance is available here
const httpClient = myHttpModule.instance.httpClient;
httpClient.get('/foo', { responseType: 'text'}).subscribe();
})
.catch(err => console.error(err));
这种方法与 JIT 和 AOT 兼容(这有利于使用HttpClient
除了 Angular 之外,因为这可以显着降低占用空间)开箱即用。
否则,可以执行自定义同步引导例程。这是可能的,因为HttpClient
不需要异步初始化。
An example:
@NgModule({
imports: [BrowserModule, HttpClientModule]
})
export class MyHttpModule {
static httpClient?: HttpClient;
constructor(public _injector: Injector) {
MyHttpModule.httpClient = this._injector.get(HttpClient);
}
ngDoBootstrap() {}
}
const platform = platformBrowserDynamic();
const compiler = platform.injector.get(CompilerFactory).createCompiler();
const moduleFactory = compiler.compileModuleSync(MyHttpModule);
platform.bootstrapModuleFactory(moduleFactory)
.catch(err => console.error(err));
const httpClient = MyHttpModule.httpClient;
httpClient.get('/foo').subscribe();
这在 JIT 中可以工作,但上面代码中的 Angular CLI 无法有效处理 AOT。该代码涉及编译器,而在 AOT 编译模式下不需要编译器(这就是它的目的)。为了使用 AOT,应该使用以下命令进行编译ngc
应该创建编译器和使用模块工厂的单独入口点。引导例程变得更加简单,因为它不涉及编译器,例如:
...
import { platformBrowser } from '@angular/platform-browser-dynamic';
import { AppModuleNgFactory } from '<path to aot>/src/app/my-http-module.ngfactory';
const platform = platformBrowser();
platform.bootstrapModuleFactory(AppModuleNgFactory)
.catch(err => console.error(err));
const httpClient = MyHttpModule.httpClient;
httpClient.get('/foo').subscribe();