2016-08-23 76 views
4

我必須使用HTTP服務:角2 DI,使用自定義HTTP

import { Injectable }  from '@angular/core'; 
import { Inject } from '@angular/core'; 
import { Http, Headers, Response } from '@angular/http'; 

@Injectable() 
export class OrdersService { 
    constructor(@Inject(Http) private http:Http) {} 
    ... 
} 

和使用它

import { Component } from '@angular/core'; 
import { FormBuilder, Validators } from '@angular/common'; 
import { HTTP_PROVIDERS } from '@angular/http'; 
import { Router} from '@angular/router'; 

import { OrdersService } from '../services/orders.service' 

@Component({ 
    selector: 'login', 
    templateUrl: './login.component.html', 
    providers: [ 
     HTTP_PROVIDERS, //{ provide: Http, useClass: Http } 
     AuthService, AuthStore, 
     OrdersService 
    ] 
}) 
export class LoginComponent { 

    constructor(private authService: AuthService, private ordersService: OrdersService){} 
     .... 
} 

這個工作的組成部分。我有一些註釋掉的文字{提供:Http,useClass:Http}。我想在這裏提供我自己的類,它擴展了Http,但仍具有相同的依賴關係。我在這裏採取的第一步是明確使用Http。

只要我取消註釋該文本(並添加一個http導入),一切都會中斷。我收到錯誤"No provider for ConnectionBackend"。看起來HTTP_PROVIDERS剛剛停止作爲提供者工作。

  • 我該如何明確使用Http工作?
  • 如何使用我自己的CustomHttp並在HTTP_PROVIDERS中使用提供程序?

回答

2

當使用自己的CustomHttp,你並不需要使用HTTP_PROVIDERS,你需要,如果你是做以下(在你的app.module.ts如果您正在使用RC5或在您的main.ts使用RC4):

providers: [ 
    ConnectionBackend, 
    provide(
     Http, { 
      useFactory: (
       backend: XHRBackend, 
       defaultOptions: RequestOptions) => 
       new CustomHttp(backend, defaultOptions), 
      deps: [XHRBackend, RequestOptions] 
     }), 
] 

我有同樣的問題,這固定了我。

編輯:

你並不需要,如果你正在使用RC5,因爲您將導入HttpModule進口HTTP_PROVIDERS,但我完全不記得,如果你在RC4需要HTTP_PROVIDERS。你可能需要它。

+0

在Angular 2.1.1上,不需要'HTTP_PROVIDERS'。確保在自定義http類中使用'XHRBackend'作爲構造函數參數。我在這裏寫了一個更全面的指南http://adonespitogo.com/articles/angular-2-extending-http-provider/ –

2

如果你不想改變XHRBackend和RequestOptions你可以做的實現它simplier喜歡:

providers: [ 
    {provide: Http, useClass: MyCustomHttp} 
] 
+0

在我的情況下,我有另一個自定義提供程序使用我的自定義Http實現。直到我做完這件事之前,我都遇到了問題_no_ _end_。非常感謝@Serginho –

4

從角2.1.1及以上語法提供選項被angular2隊後改變了引進新模塊概念。下面你會發現正確的語法如何添加用於HTTP自己的自定義供應商在你的app.module.ts

export function httpFactory(backend: XHRBackend, defaultOptions: RequestOptions) { 
    return new CustomHttp(backend, defaultOptions); 
} 

... 

providers: [ 
       {provide: Http, 
         useFactory: httpFactory, 
         deps: [XHRBackend, RequestOptions] 
       } 
       ] 

您也可以驗證angular2文檔瀏覽:https://angular.io/docs/ts/latest/api/http/index/XHRBackend-class.html

如果你想實施你自己的CustomHttp類我會建議你閱讀Thierry Templier的文章,他一步一步地介紹如何做到這一點。

Implementing CustomHttp for angular2這是非常有用的文章,它描述瞭如何擴展來攔截請求調用並添加自定義處理錯誤。