[英]How to instantiate an Angular HttpClient?
你如何在Angular中實例化一個HttpClient 5? 我需要在構造函數中實例化它,而不是在這一行中實例化它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); } }
謝謝
正如之前的答案所述,最好使用依賴注入。 話雖如此,您可以像下面這樣手動創建實例
const httpClient = new HttpClient(new HttpXhrBackend({ build: () => new XMLHttpRequest() }));
你真的應該使用依賴注入,因為它非常干凈和簡單:
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);
}
}
這應該讓它“工作”,但我再次建議再看看依賴注入。
更新:
就像喬塔一樣。 Toledo 在評論中指出,您實際上無法實例化HttpHandler
因為它是一個抽象類。 請參閱此處的源代碼: https : //github.com/angular/angular/blob/5.2.1/packages/common/http/src/backend.ts#L12-L27 。
所以這變得更加復雜。
對於@Component
,有一種方法可以直接使用 Angular 團隊明確建議反對的注入器。
在您的 @Component 元數據中,提供您想要直接使用的服務(在 providers 數組中),如下所示:
@Component({
providers: [HttpClient]
}
export class MyComponent {}
然后,你可以注入Injector
使用咳嗽依賴注入。 並在構造函數中訪問您的提供者,如下所示:
constructor(private injector: Injector) {
this._http = injector.get(HttpClient);
}
雖然,我認為這不適用於您的用例,因為您在問題中顯示了@Injectable
,它本身沒有元數據。 其次,您已經在使用依賴注入來獲取Injector
因此您最好只對 HttpClient 使用 DI。
似乎您仍然可以使用已棄用的ReflectiveInjector
來通過@Injectable
類來執行此@Injectable
。
總之,這是一場野鵝追逐,你真的應該使用依賴注入。 它是 Angular 中的一個基本概念,也是使該框架如此有用的原因之一。 如果由於某種原因您無法使用它,您可能需要查看除 Angular 之外的其他選項。
我需要創建一個類,在實例化時我會通知表的名稱,但我不想在構造函數中通知其他必需的參數。 下面這個例子有效:
@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 我可以)但我需要創建一個類來操作數據庫的表,現在我只是想讓編碼更干凈。 非常感謝所有的評論,我和他們一起學到了我有一天肯定會需要的東西,我會記住這些技巧。
也許通過我給的更多這個例子,有人可能會建議一些方法來做到這一點。 謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.