Angular 2如何使单例服务可用于延迟加载的模块

甲虫汁

根据我对的理解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()

具体服务是MdIconRegistryprovidersMdIconModuleAngular Material 2 alpha 7-3此服务用于注册svg图标,这些图标随后可以在带有<md-icon svgIcon='iconName'>标签的页面上显示所以:

  • 我是MdIconModule从根导入的AppModule
  • 我使用了有问题的服务在我的SVG图标中注册 AppComponent

该图标可见并且运行良好,但仅在启动时加载的模块中可用。延迟加载的模块无法看到这些图标,因此我怀疑Angular注入器未注入相同的MdIconRegistry服务实例

tl; dr:如何使懒惰加载的组件可以从第三方模块获得该服务?

这是一个演示该问题的插件(编码为typescript)。

PS:这只是在github上引起了MdIconModule开发人员的注意

詹姆士
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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使 Angular2 服务成为单例......再次

来自分类Dev

Angular 2-单例服务?

来自分类Dev

Angular 5 - 组件在延迟加载模块中不可用

来自分类Dev

如何使用延迟加载仅加载angular 8中的模块

来自分类Dev

在angular2中注入单例服务

来自分类Dev

Angular2服务未作为单例注入

来自分类Dev

Angular如何重新初始化单例服务

来自分类Dev

Angular 2模块延迟加载不起作用

来自分类Dev

延迟加载不加载模块-Angular 8

来自分类Dev

Angular中的单例服务(带离子)

来自分类Dev

Angular 7及更高版本:用于注入两个组件的服务,不像单例

来自分类Dev

Angular,在延迟加载的模块中暴露组件

来自分类Dev

带有依赖模块的 Angular 延迟加载

来自分类Dev

Angular <custom-component> 不适用于延迟加载的模块

来自分类Dev

angular 4 的模块延迟加载不适用于 Laravel 项目

来自分类Dev

Angular 2依赖注入单例

来自分类Dev

在Angular 2中使用服务单例作为数据源的示例

来自分类Dev

通过共享单例服务进行Angular2组件通信

来自分类Dev

导航路线时,Angular 2延迟加载模块会多次初始化?

来自分类Dev

Angular2 RC5路由器找不到模块(延迟加载)

来自分类Dev

Angular.js服务是单例的还是每次创建的?

来自分类Dev

Angular:单例服务与Mat对话框问题

来自分类Dev

Angular:通过依赖注入实现的单例服务问题

来自分类Dev

Angular 8 CLI:如何使用提供程序延迟加载不可路由的功能模块

来自分类Dev

Angular不会加载我的服务模块

来自分类Dev

Angular不会加载我的服务模块

来自分类Dev

Angular 2和Webpack延迟加载

来自分类Dev

Angular 2和Webpack延迟加载

来自分类Dev

Angular2延迟加载路线问题

Related 相关文章

热门标签

归档