我们应该如何把服务的范围限制到模块中?
如果一个模块在应用程序启动时就加载,它的 @NgModule.providers
具有 全应用级作用域 。 它们也可用于整个应用的注入中。
导入的提供商很容易被由其它导入模块中的提供商替换掉。 虽然设计如此,但是也可能引起意料之外的结果。
作为一个通用的规则,应该 只导入一次 带提供商的模块,最好在应用的 根模块 中。 那里也是配置、包装和改写这些服务的最佳位置。
假设模块需要一个定制过的 HttpBackend
,它为所有的 Http 请求添加一个特别的请求头。 如果应用中其它地方的另一个模块也定制了 HttpBackend
或仅仅导入了 HttpModule
,它就会改写当前模块的 HttpBackend
提供商,丢掉了这个特别的请求头。 这样服务器就会拒绝来自该模块的请求。
要消除这个问题,就只能在应用的根模块 AppModule
中导入 HttpModule
。
只要有可能,就让模块惰性加载。Angular 为惰性加载模块提供了独立的子注入器。该模块中的提供商只对由该注入器创建的组件树可见。
继续看了例子,假设某个模块的组件真的需要一个私有的、自定义的 HttpBackend
。
那就创建一个 "顶级组件" 来扮演该模块中所有组件的根。把这个自定义的 HttpBackend
提供商添加到这个顶级组件的 providers
列表中,而不是该模块的 providers
中。回忆一下,Angular 会为每个组件实例创建一个子注入器,并使用组件自己的 providers
来配置这个注入器。
当该组件的子组件需要一个 HttpBackend
服务时,Angular 会提供一个局部的 HttpBackend
服务,而不是应用根注入器创建的那个服务。此时,子组件将正确发起 http 请求,而不管其它模块对 HttpBackend
做了什么?同时需要确保模块中的组件都创建成这个顶级组件的子组件。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论