如何实例化Angular HttpClient?

时间:2018-01-21 21:56:23

标签: angular typescript

如何在Angular 5中实例化HttpClient?我需要在构造函数中实例化它,但不在此行constructor(private _Http: HttpClient)中。

也许像这个假设的例子:



import { HttpClient, HttpHandler } from '@angular/common/http';
private _Http: HttpClient;
private _httpHandler: HttpHandler;
@Injectable()
export class DataService {
    constructor() {
        this._Http = new HttpClient(_httpHandler);
    }
}




谢谢

3 个答案:

答案 0 :(得分:3)

你应该真正使用依赖注入,因为它非常干净和简单:

constructor(private http: HttpClient) {}

如何使用HttpClient和所有Angular服务。在此处阅读有关DI的更多信息:https://angular.io/guide/dependency-injection

但是,你可以在没有DI的情况下从技术上做到这一点,因为它只是一个类。

您目前使用this._Http = new HttpClient(_httpHandler);执行的操作的问题是,HttpClient需要HttpHandler的实例,但现在它只是获得了没有名为_httpHandler的值的变量,其类型为HttpHandler。你需要这样做:

let _httpHandler = new HttpHandler();

@Injectable()
export class DataService {
    constructor() {
        this._Http = new HttpClient(_httpHandler);
    }
}

那应该让它工作"工作",但我再次建议再看一下依赖注入。

更新:

就像Jota一样。托莱多在评论中指出,你实际上无法实例化HttpHandler,因为它是一个抽象类。请参阅此处的源代码:https://github.com/angular/angular/blob/5.2.1/packages/common/http/src/backend.ts#L12-L27

所以这变得更复杂了。

对于@Component,有一种方法可以直接使用注射器the Angular team explicitly advises against

在@Component元数据中,提供您想要直接使用的服务(在providers数组中),如下所示:

@Component({
 providers: [HttpClient]
}
export class MyComponent {}

然后你可以使用 cough 依赖注入注入Injector。并在构造函数中访问您的提供程序,如下所示:

constructor(private injector: Injector) {
  this._http = injector.get(HttpClient);
}

虽然我认为这不适用于您的用例,因为您在问题中显示@Injectable,而本身并没有元数据。其次,您已经使用依赖注入来获取Injector,因此您可以将HID用于HttpClient。

您似乎仍然可以使用已弃用的ReflectiveInjector来使用@Injectable类执行此操作。

总之,这是一个疯狂的追逐,你应该真的使用依赖注入。它是Angular中的一个基本概念,也是使框架如此有用的一个方面。如果由于某种原因您无法使用它,您可能需要查看除Angular之外的其他选项。

答案 1 :(得分:2)

如先前的回答所述,最好使用依赖项注入。话虽如此,您可以像下面这样手动创建实例

const httpClient = new HttpClient(new HttpXhrBackend({ build: () => new XMLHttpRequest() }));

答案 2 :(得分:0)

我需要创建一个类,在实例化时我通知表的名称,但我不想在构造函数中通知其他必需参数。 以下示例有效:

@Injectable() 
export class MvsDbTable implements OnInit {
constructor( 
    @Inject('_tableName') public _tableName: string, 
    @Inject('_HTTP') public _HTTP: HttpClient  ) {}

所以我在另一个服务中实例化:

public _tblFinances = new MvsDbTable('Finances', this._Http);

但我不想用这个",this.http"

据我所知,通常这种情况看起来很奇怪,甚至不像我以前用Http那样可能(因为我可以使用http),但我需要创建一个类来操作数据库的表,现在我只想让编码更清洁。 非常感谢所有评论,我和他们一起学习了一些我当然需要的东西,我会记住这些提示。

也许更多的这个例子我给了某人可能会建议一些方法来做到这一点。谢谢