我有一个Api
类来处理与服务器的所有交互。
@Component({
providers: [Http, HTTP_PROVIDERS]
})
export class Api {
constructor(private http: Http) {}
// functions for different Api end points
}
如果我想将Api
课程注入我的Home
组件,我可以这样:
@Component({
selector: 'my-app',
directives: [FORM_DIRECTIVES, CORE_DIRECTIVES],
templateUrl: '/app/views/home.html',
providers: [Api, HTTP_PROVIDERS] // specifically this line
})
export class HomeComponent {
constructor(private api: Api) {} // and this line
...
}
没有HTTP_PROVIDERS
Api
没有注明Http
。无论好坏,这导致我在API_PROVIDERS
课程中创建Api
,这样如果需要更多注入,我就不必更新Api
的每个地方注入(这可能是应用程序中的大多数组件)。这改变了这样的事情:
// at the bottom of my Api Component
export var API_PROVIDERS = [Api, HTTP_PROVIDERS];
...
// in my Home Component
@Component({
selector: 'my-app',
directives: [FORM_DIRECTIVES, CORE_DIRECTIVES],
templateUrl: '/app/views/home.html',
providers: [API_PROVIDERS]
})
这是因为我没有得到DI错误,我的代码似乎正常运行。但是,如果我将该提供程序移动到我的引导程序调用(在boot.ts中,最初由SystemJS加载的文件),我得到这个:
bootstrap(AppComponent, [API_PROVIDERS]);
现在,我不需要providers
组件或@Component
组件的Home
定义中的Api
属性。似乎只有Api
和HTTP_PROVIDERS
可用于准备注入构造函数的所有内容。
// Api Component becomes
@Component({})
// Home Component becomes
@Component({
selector: 'my-app',
directives: [FORM_DIRECTIVES, CORE_DIRECTIVES],
templateUrl: '/app/views/home.html'
})
向Http
注入Api
并将Api
注入Home
组件也是有效的(它们仍然是构造函数中的参数)。页面底部的Angular 2 Api for bootstrap状态表示第二个参数是:
customProviders:可以添加到应用程序注入器的另一组提供程序,以覆盖默认的注入行为。
我不太明白这意味着什么,或者通过将我的提供者包含在那里而不是@Component
装饰者内部,我会看到什么副作用。我们可能不应该把我们想要注入的所有东西都放到bootstrap参数中,因为那时我们根本不需要providers
中的@Component
属性。
当我在bootstrap()
的第二个参数而不是@Component
装饰器中列出我的提供商时会发生什么变化?该参数用于什么?
我正在使用Angular 2的2.0.0-beta.0版本。
答案 0 :(得分:3)