2016-04-06 38 views
20

角版本:2.0.0-beta.13在服务中注入http会导致“没有提供程序给Http!”错误

我试图注入http到服务:

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

我列出HTTP_PROVIDERS在我的应用程序的根组件供应商,所以这个提供者应该在我的应用程序可用于任何组件:

@Component({ 
    providers: [HTTP_PROVIDERS], 
}) 
export class AppComponent {} 

然而,当我运行该应用程序,我得到以下错误:

EXCEPTION: Error: Uncaught (in promise): No provider for Http! (HttpReqComponent -> GithubService -> Http)

我在做什么错?

编辑

我改变providersviewProviders和错误已经不复存在了!

@Component({ 
    viewProviders: [HTTP_PROVIDERS], 
}) 
export class AppComponent {} 

但是,我无法解释为什么这是工作。 http不被任何视图直接访问。它只能在GithubService内访问。那么为什么我必须声明HTTP_PROVIDERSviewProvider

编辑2

嗯,我搬离AppComponent的providers申报下来的地方,我需要它的成分和现在的作品!所以在根层面宣布它一定会有一些怪癖。

@Component({ 
    providers: [HTTP_PROVIDERS, GithubService], 
}) 
export class HttpReqComponent { } 

事实上,无论是providersviewProviders作品。结果发现viewProviders实际上更具限制性,并提供了更好的组件封装。详情请参阅this article

+0

你不需要viewProvider,实际上我搜索它并没有找到任何引用,但我测试过它可以和**提供程序**以及** viewProviders **一起使用。如果你仍然不确定创建一个plunker代码应用程序来看看。 – tibbus

+0

这真的很奇怪,因为它应该可以工作。看到这个plunkr:https://plnkr.co/edit/gG84YnQPItRSf0tIJSMK?p=preview。我有兴趣了解更多关于您的环境的知识;-)谢谢! –

回答

12

它可以,如果你去Providers:[HTTP_PROVIDERS]但它很好参考HTTP_PROVIDERSbootstrap()。您不需要使用viewProvider,它在那里用于其他目的。

您必须确保已包含http.dev.js(通过CDN/node_modules)。

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/2.0.0-beta.13/http.dev.js"></script> 

然后在rootComponent

import {HTTP_PROVIDERS} from 'angular2/http'; 
import {GithubService} from './GithubService'; 

bootstrap(rootComponent,[HTTP_PROVIDERS,GithubService]); 

// if you reference HTTP_PROVIDERS here globally (in bootstrap), you don't require to use providers:[HTTP_PROVIDERS] in any component. 
// same way GithubService reference has been passed globally which would create single instance of GithubService (In case if you want) 
GithubService

然后,

import {Http} from 'angular2/http'; 

@Injectable() 
export class GithubService { 
    ... 
    constructor(private http: Http) { // this will work now without any error 
    } 
} 
+0

谢谢@micronyks。 AFAIK,Angular 2文档不鼓励使用引导来注册提供者(参见[这里](https://angular.io/docs/ts/latest/guide/dependency-injection.html))。现在我通过将注册移动到需要它的组件来解决问题。请参阅我的*编辑2 *。 – Naresh

+0

我也读过;-)我不认为它适用于Angular2的提供者,如'ROUTER_PROVIDERS'或'HTTP_PROVIDERS'。我认为评论意见是限制应用程序中提供者的范围。这只是一种组织应用程序的方式。这就是说我认为在引导应用程序时有必要定义一些服务的时候有些用例。例如,当你想为不同部分共享服务时。 –

+0

@micronyks,我发现另一个参考,也建议不要使用引导程序注册提供程序:请参见[这里](https://github.com/mgechev/angular2-style-guide#services-and-dependency-injection)。现在我会坚持这个建议。谢谢你的帮助。 – Naresh

20

下面这个链接

Angular2/http Exception no ConnectionBackend @abreneliere的答案是正确的我与角2快速入门(https://angular.io/guide/quickstart)工作,我试图将服务添加到组件一段时间。

答案: 文件:app.module.ts 代码:

import { NgModule } from '@angular/core'; 
import { BrowserModule } from '@angular/platform-browser'; 
import { HttpModule } from "@angular/http"; 
import { AppComponent } from './app.component'; 

@NgModule({ 
    imports: [BrowserModule, HttpModule], 
    declarations: [AppComponent], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 
+0

这对我使用'@ angular/http:〜2.4.0'的技巧。解决方案简单干杯! – mikeym

+0

如果确实投了票(Y) – SoProgram

+0

已经投票! – mikeym

0

您可以导入{ HttpModule }到有,你宣布在组件您正在使用注射服务的模块,给定的模块不懒加载。

相关问题