如何在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);
}
}

谢谢
答案 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),但我需要创建一个类来操作数据库的表,现在我只想让编码更清洁。 非常感谢所有评论,我和他们一起学习了一些我当然需要的东西,我会记住这些提示。
也许更多的这个例子我给了某人可能会建议一些方法来做到这一点。谢谢