考虑以下代码:
var SearchResultComponent = ng.core.Component({
selector: "search-result",
directives: [ng.router.ROUTER_DIRECTIVES, FormComponent],
viewProviders: [ng.http.HTTP_PROVIDERS],
templateUrl: "componentTemplates/SearchResult.html"
}).Class({
constructor: [ng.http.Http, function( http) {
this.http = http;
}],
ngOnInit: function(){
}
})
这里我们提供了viewProviders ng.http.HTTP_PROVIDERS,我们注入的服务是ng.http.Http。那么它们之间的区别是什么。我们为什么需要ViewProviders。
答案 0 :(得分:2)
Angular的依赖注入(DI)使用提供程序来解析依赖关系。
提供商和服务不是"要么是",而是"以及"
如果您的组件或服务具有依赖关系(例如,在您的示例中为ng.http.Http
),则DI会查找提供程序树并从找到的第一个提供程序返回实例。
如果您的组件的providers
或viewProviders
没有注册所请求的类型或令牌的提供商,则DI会检查父组件提供商,直至{{1 }}
您的组件或服务传递给构造函数的实例取决于此依赖项的提供程序的注册位置。
如果组件B 和父组件A具有已注册的特定服务的提供者,则B从B获取实例。如果C,B的兄弟组件也依赖于此服务但没有注册自己的提供者,它获得A的服务实例。
这样您就可以定义服务实例的范围。