簡體   English   中英

如何實例化一個 Angular HttpClient?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM