- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试手动注入(inject)HttpClientModule
,它在外部独立运行(可能是!)在使用静态注入(inject)器之前,我使用的是反射注入(inject)器并且代码工作正常,但现在反射注入(inject)器已被弃用,我想用静态注入(inject)器更新我的代码。
//appInjector.ts
export class AppInjector {
private static _instance: AppInjector = new AppInjector();
private _injector;
constructor() {
console.log('app-injector');
AppInjector._instance = this;
this._injector = ReflectiveInjector.resolveAndCreate([
...[getAnnotations(HttpClientModule)[0].providers],
MY_HTTP_DEPENDENT_PROVIDERS
]);
static getInstance(): AppInjector {
return AppInjector._instance;
}
get(cls: any): any {
return this._injector.get(cls);
}
}
//someFile.ts
const translate = AppInjector.getInstance().get(TranslateResource);
引用This Post用于注释 fn。现在,当我尝试将 Http 客户端与静态注入(inject)一起使用时,它给出了错误:StaticInjectorError[HttpClent]:不支持函数/类
//app module
@NgModule({
imports: [],
declarations: [],
providers: [],
entryComponents: [App]
})
export class AppModule {
ngDoBootstrap(app) {
console.log('bootstrapping');
app.bootstrap(App);
}
因此,如果我记录,它将记录 app-injector
,然后是 bootstrapping
。
最佳答案
StaticInjector
应该是 ReflectiveInjector
的替代品,它不需要 Reflect
API。 getAnnotations
是低级 hack,在当前状态下它可能无法与 StaticInjector
一起使用。此外,getAnnotations
在设计上与 AOT 不兼容。
最好按照框架应该完成的方式为模块创建注入(inject)器,即应该引导模块。由于没有要引导的组件,因此应指定 ngDoBootstrap
Hook 。
默认情况下,引导过程是异步的。如果这不是问题,可以链接初始化 promise 以获取模块实例。
安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 兼容(除了 Angular 之外,这对于使用 HttpClient
非常有用,因为这会显着降低占用空间)。
否则可以改为执行自定义同步引导例程。这是可能的,因为 HttpClient
不需要异步初始化。
安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
编译器编译它,并且应该创建一个使用模块工厂的单独入口点。 Bootstrap 例程变得更加简单,因为它不涉及编译器,例如:
...
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();
关于javascript - StaticInjectorError [HttpClent] : Function/class not supported,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50118712/
我才刚刚开始学习如何使用 Angular 2 和 Ionic 3.20.0,但现在面临挑战。我正尝试在我的主页中显示产品图片,但该应用程序抛出此错误 ERROR Error: Uncaught (in
所以我正在尝试使用 DatePicker ,但是我得到了一个 StaticInjectorError 这是我尝试过的: import {Component} from '@angular/core';
我收到此错误,如下面的屏幕截图所示。 我在这里研究了几个类似的问题。最常见的建议是“将您的服务添加到您的应用模块的提供程序数组”。当我使用 Angular 元素编写 Web 组件时,我不会主动使用默认
我已经搜索了很多有关此错误的信息,但没有任何有用的信息,这种错误通常有角度地告诉您缺少提供程序的对象是什么,但是这次它给出了 StaticInjectorError(AppModule)[[objec
当我在 Angular 中使用表格元素时,有时会在浏览器的控制台中显示此错误 有什么问题? 我该如何解决? Angular HTML: name
你好,我收到这样的错误,这是什么原因? StaticInjectorError[Http]: StaticInjectorError[Http]: NullInjectorError: 没有 Http
运行 ng 测试 时完全错误: Error: StaticInjectorError(DynamicTestModule)[NotificationsComponent AuthService]:
使用 ASP.NET Core API 应用程序登录到 Angular 应用程序后,出现以下错误 Error: Uncaught (in promise): Error: StaticInjector
angular cli 创建的项目 Angular CLI: 1.7.2 Node: 6.11.4 OS: win32 x64 Angular: 5.2.7 ... animations, commo
从 Angular 5 迁移到 6 后,我遇到了静态注入(inject)器的问题。错误是: ERROR Error: StaticInjectorError(AppModule)[StorageSer
我最近将我的项目从 Angular5 更新到 Angular6。 该项目正在成功构建,但我在浏览器控制台中收到以下错误: Unhandled Promise rejection: StaticInje
我尝试在 Angular 中使用“providedin”功能,但收到错误“StaticInjectorError(AppModule)[DashboardComponent -> DashboardS
当我在浏览器中启动我的 Angular 5 页面时,我的浏览器控制台出现以下错误。 ERROR Error: StaticInjectorError(AppModule)[AppComponent -
我试图从我的 api 中提取数据,并将其填充到我的 ionic 应用程序中,但是当我进入应该填充数据的页面时它崩溃了。下面是我的两个 .ts 文件: import { Component } from
我已经加了RouterTestingModule到我的单元测试导入。但它仍然抛出以下错误。 唯一的区别是知道我的路由页面与规范不同。 我附上了我的代码以供引用。 我需要改变什么?或者我如何使用我的路由
我在我的 Ionic 4 应用程序中使用插件 '@ionic-native/bluetooth-serial/ngx' 与热敏打印机进行通信。如果我使用 android 7.1.1 为 android
我正在使用一个组件作为通过路由到达的常规组件,但我希望它在使用注入(inject)组件时也将其用作模式对话框的“目标”: export class Component1 implements OnIn
我正在构建一个新的 Angular (v6.0.1) 应用程序,并希望开始连接它以通过服务处理数据。我创建了一个新的提供程序,如下所示: @Injectable({ providedIn: '
我正尝试按照此链接中的说明向我的 Angular 应用程序添加分页: Go to "Content switching" 我这样做了: 在 app.module.ts 中: import { Pagi
我正在尝试手动注入(inject)HttpClientModule,它在 外部独立运行(可能是!)在使用静态注入(inject)器之前,我使用的是反射注入(inject)器并且代码工作正常,但现在反射
我是一名优秀的程序员,十分优秀!