根据我对的理解Angular 2 rc5
,要使来自另一个模块(非AppModule
)的服务可以作为单个组件提供给每个组件,即使是那些延迟加载的组件,我们也不要将服务包含在该providers
另一个模块的数组中。我们改为将其导出,RouterModule.forRoot()
然后将结果导入AppModule
根据文档:
只有在由根AppModule导入时,SharedModule才应提供UserService。SharedModule.forRoot方法可帮助我们应对这一挑战... SharedModule没有
providers
...当我们将SharedModule添加到AppModule的导入中时,我们称为forRoot。这样,AppModule获得了导出的类,并且SharedModule同时提供了单例UserService
提供者。
我真的在努力让延迟加载的路由可以使用第三方服务(imports
我的数组中的模块所使用的服务AppModule
)。我无法控制该第三方模块,因此我不能像从服务之一中那样从该NgModule.providers
模块的数组中删除该服务并将其放置在内部RouterModule.forRoot()
。
具体服务是MdIconRegistry
,providers
在MdIconModule
中Angular Material 2 alpha 7-3
。此服务用于注册svg图标,这些图标随后可以在带有<md-icon svgIcon='iconName'>
标签的页面上显示。所以:
MdIconModule
从根导入的AppModule
AppComponent
该图标可见并且运行良好,但仅在启动时加载的模块中可用。延迟加载的模块无法看到这些图标,因此我怀疑Angular注入器未注入相同的MdIconRegistry
服务实例。
tl; dr:如何使懒惰加载的组件可以从第三方模块获得该服务?
这是一个演示该问题的插件(编码为typescript
)。
I do not think it has anything to do with the component being lazy-loaded.
LazyLoadedComponent不是AppModule的一部分,而是LazyModule的一部分。根据文档,一个组件只能是一个模块的一部分。如果您还尝试将LazyLoadedComponent添加到AppModule,则将收到错误消息。因此,LazyLoadedComponent甚至根本看不到MdIconModule。您可以通过在调试器中查看模板输出来确认这一点-它保持不变。
<md-icon svgIcon="play"></md-icon>
该解决方案似乎是将MdIconModule添加到LazyModule,虽然这不能单独解决问题,但确实会向输出添加错误。
检索图标时出错:错误:找不到名称为“:play”的图标
现在模板输出看起来像这样,所以我们知道它正在加载。
<md-icon role="img" svgicon="play" ng-reflect-svg-icon="play" aria-label="play"></md-icon>
我添加了对LazyLoadedComponent的addSvgIconSet的调用,它可以正常工作……因此,这证明了每个组件都有MdIconRegistry服务的实例–不是您想要的,但可能会为您指明正确的方向。
这是新的插件-http://plnkr.co/edit/YDyJYu? p= preview
经过进一步审查,我在文档中发现了这一点:
为什么在延迟加载的模块中提供的服务仅对该模块可见?
与启动时加载的模块的提供程序不同,延迟加载的模块的提供程序具有模块作用域。
最终更新!这就是答案。MdIconModule没有为延迟加载的组件正确设置...但是我们可以轻松创建自己的模块,该模块已正确设置并使用了它。
import { NgModule } from '@angular/core';
import { HttpModule } from '@angular/http';
import { MdIcon } from '@angular2-material/icon';
import { MdIconRegistry } from '@angular2-material/icon';
@NgModule({
imports: [HttpModule],
exports: [MdIcon],
declarations: [MdIcon]
})
export class MdIconModuleWithProviders {
static forRoot(): ModuleWithProviders {
return {
ngModule: MdIconModuleWithProviders,
providers: [ MdIconRegistry ]
};
}
}
Plunk已更新,可以正常运行。(对不起,更新相同)-> http://plnkr.co/edit/YDyJYu?p=preview
可能会提交一个拉取请求,以使Angular Material导出两种样式的模块。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句