Javascript StaticInjectorError[HttpClent]:不支持函数/类

Javascript StaticInjectorError[HttpClent]:不支持函数/类,javascript,angular,typescript,angular-httpclient,Javascript,Angular,Typescript,Angular Httpclient,我正在尝试手动注入HttpClientModule,该模块在应用程序外部独立运行(可能是!)。在使用静态注入器之前,我使用的是反射注入器,代码运行良好,但现在反射注入器已被弃用,我想用静态注入器更新代码 //appInjector.ts 出口类AppInjector{ 私有静态_实例:AppInjector=new AppInjector(); 专用注射器; 构造函数(){ console.log('app-injector'); AppInjector.\u实例=此; 此._injector

我正在尝试手动注入
HttpClientModule
,该模块在应用程序外部独立运行(可能是!)。在使用静态注入器之前,我使用的是反射注入器,代码运行良好,但现在反射注入器已被弃用,我想用静态注入器更新代码

//appInjector.ts
出口类AppInjector{
私有静态_实例:AppInjector=new AppInjector();
专用注射器;
构造函数(){
console.log('app-injector');
AppInjector.\u实例=此;
此._injector=ReflectiveInjector.resolveAndCreate([
…[getAnnotations(HttpClientModule)[0]。提供程序],
我的\u HTTP\u依赖\u提供程序
]);
静态getInstance():AppInjector{
返回AppInjector.\u实例;
}
获取(cls:any):any{
返回此。\u喷油器获取(cls);
}
}
//someFile.ts

const translate=AppInjector.getInstance().get(TranslateResource)
StaticInjector
被认为是不需要
Reflect
API的
ReflectiveInjector
的替代品。
getAnnotations
是低级黑客,在当前状态下可能无法与
StaticInjector
一起工作。而且,
getAnnotations
在设计上与AOT不兼容。

最好按照框架应该执行的方式为模块创建一个注入器,即模块应该是自举的。因为没有要自举的组件,所以应该指定
ngDoBootstrap
hook

默认情况下,引导过程是异步的。如果这不是一个问题,可以将初始化承诺链接起来以获取模块实例

安:

这将在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();
。。。
从“@angular/platform browser dynamic”导入{platformBrowser};
从'/src/app/myhttp module.ngfactory'导入{AppModuleNgFactory};
const platform=platformBrowser();
platform.bootstrapModuleFactory(AppModuleNgFactory)
.catch(err=>console.error(err));
const httpClient=MyHttpModule.httpClient;
httpClient.get('/foo').subscribe();

感谢您提供的详细答案,但如果我按照您所说的去做,我的AppModule会去哪里,我的工作方式可能是我的问题弄错了。我可以访问我在应用程序中任何位置的Relative injector阵列中提供的所有资源,并且AppInjector甚至在应用程序引导之前被触发。我更新了问题。请检查如果您需要更多详细信息,请告诉我。我正在运行旧版本的webpack,但尚未启动cli。尝试一次升级一个应用程序。它可以去任何您喜欢的地方,您只需确保在需要访问HttpClient时已引导它。在上面列出的代码中,injector是实例属性,\u injector,您可以使用如果需要也可以。此代码假定没有Angular应用程序,只有与非Angular应用程序一起使用的HttpClient。如果不是这样,这可能是XY问题-您可以以相同的方式从Angular应用程序共享HttpClient和injector。
@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();
...
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();