2016-08-23 78 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这是非常有用的文章,它描述了如何扩展来拦截请求调用并添加自定义处理错误。