【发布时间】:2016-04-06 20:28:52
【问题描述】:
Angular 版本:2.0.0-beta.13
我正在尝试将http 注入服务:
@Injectable()
export class GithubService {
...
constructor(private http: Http) {
}
}
我已将HTTP_PROVIDERS 列为我的应用程序根组件中的提供程序,因此该提供程序应可用于我的应用程序中的任何组件:
@Component({
providers: [HTTP_PROVIDERS],
})
export class AppComponent {}
但是,当我运行此应用程序时,我收到以下错误:
异常:错误:未捕获(承诺):没有 Http 提供者! (HttpReqComponent -> GithubService -> Http)
我做错了什么?
编辑
我将providers 更改为viewProviders,现在错误消失了!
@Component({
viewProviders: [HTTP_PROVIDERS],
})
export class AppComponent {}
但是,我无法解释为什么这是有效的。 http 没有被任何视图直接访问。它只能在GithubService 内部访问。那么为什么我必须将HTTP_PROVIDERS 声明为viewProvider?
编辑 2
好吧,我将 providers 声明从 AppComponent 移到了我需要它的组件,现在它可以工作了!所以在根级别声明它一定有一些怪癖。
@Component({
providers: [HTTP_PROVIDERS, GithubService],
})
export class HttpReqComponent { }
实际上,providers 和 viewProviders 都有效。事实证明,viewProviders 实际上更具限制性,并提供了更好的组件封装。详情请见this article。
【问题讨论】:
-
你不需要 viewProvider,实际上我搜索它并没有找到任何参考,但我测试过它可以与 providers 以及 viewProviders 一起使用 。如果您仍然不确定,请创建一个 plunker 代码应用程序以准确查看。
-
这真的很奇怪,因为它应该可以工作。看到这个 plunkr:plnkr.co/edit/gG84YnQPItRSf0tIJSMK?p=preview。我有兴趣了解更多关于您的环境的信息 ;-) 谢谢!