我想在静态方法或类中使用angular HttpClient(在类中,它不能定义为构造函数参数).

我试过这样的方法:

export class SomeNotInjectableService {
  static doSomething() {
    const injector = Injector.create({
      providers: [{provide: HttpClient, deps:[]}]
    });
    const httpClient: HttpClient = injector.get(HttpClient);

    httpClient.request(...); // error Cannot read property 'handle' of undefined
  }
}

这是在静态服务方法中手动注入客户机的try .没用.我很好奇如何做到这一点,或者如何在一个不是组件的类中,以普通方法注入客户机.

推荐答案

我不太清楚为什么它不能像你try 的那样工作(可能是你创建注入器时遗漏了什么),但如果你使用"注入"注入器,它就会工作

如果查看抛出错误的源代码,您会发现它提到了请求的处理程序,在您的示例中它似乎为空.当HttpClient以"传统"方式提供时,angular可能会注册一些内部处理程序,但不是按照您的方式提供

// Start with an Observable.of() the initial request, and run the handler (which
// includes all interceptors) inside a concatMap(). This way, the handler runs
// inside an Observable chain, which causes interceptors to be re-run on every
// subscription (this also makes retries re-run the handler, including interceptors).

var /** @type {?} */ events$ = rxjs_operator_concatMap.concatMap.call(rxjs_observable_of.of(req), function (req) { return _this.handler.handle(req); });

Work around:

app.module.ts

import {Injector} from '@angular/core';

export let InjectorInstance: Injector;

export class AppModule 
{
  constructor(private injector: Injector) 
  {
    InjectorInstance = this.injector;
  }
}

你的静态类/方法

import {InjectorInstance} from './app.module';

export class SomeNotInjectableService {
  static doSomething() 
  {
  /*  const injector = Injector.create({
      providers: [{provide: HttpClient, deps:[]}]
    });
    const httpClient: HttpClient = injector.get(HttpClient);
*/
    const httpClient =  InjectorInstance.get<HttpClient>(HttpClient);

    httpClient.request(...)...
  }
}

Stackblitz的例子:

Typescript相关问答推荐

根据第一个参数的值设置第二个参数的类型

类型脚本如何将嵌套的通用类型展开为父通用类型

如何在函数参数中使用(或模仿)`success`的行为?

为什么tsx不判断名称中有"—"的属性?'

不推荐使用Marker类-Google map API警告

Express Yup显示所有字段的所有错误

表单嵌套太深

如何在使用条件类型时使用void

类型';字符串|数字';不可分配给类型';未定义';.类型';字符串';不可分配给类型';未定义';

ANGLE订阅要么不更新价值,要么不识别价值变化

如何创建由空格连接的多个字符串的类型

NPM使用Vite Reaction应用程序运行预览有效,但我无法将其部署到Netlify

如何键入派生类的实例方法,以便它调用另一个实例方法?

如何在具有嵌套数组的接口中允许新属性

字幕子集一个元组的多个元素

VUE 3类型';字符串';不可分配给类型';参考<;字符串&>

基于区分的联合键的回调参数缩小

在tabel管理区域react js上设置特定顺序

传入类型参数<;T>;变容函数

TS2532:对象可能未定义