2017-10-28 187 views
1

我现在使用谷歌搜索大约2周,但找不到任何合适的答案给我的问题。所以我在这里问。角度4.4.6懒惰加载模块中的共享服务

说明

工具:角4.4.6和角CLI 1.4.9

我有我的工作很简单的应用程序。它有AuthModule,AdminModule,LayoutModule和SharedModule。一切工作正常,如果我将所有这些模块添加到AppModule,但问题是,当我添加这些模块的AppModule,然后我的供应商....大小远远超过600kb(--AOT)。

模块说明。

ShareModule:有一些模型和服务是每个模块共同的,例如, HttpServiceAuthModule:包含简单的登录和注册组件使用HttpService的从共享模块

所以我决定把它们与描述here路由所有懒加载的模块。这将供应商... js的大小减少了近50%,但之后依赖关系不起作用。

尽管我在LazyLoaded模块中引用了SharedModule,但仍不能解决问题,依赖关系不起作用。我知道,每个延迟加载的模块都会创建自己的DI树,但不会解决除已在延迟加载的模块中创建和提供的依赖关系外的其他依赖关系。

正如我在工具部分所说的,我使用的是Angular-CLI,它具有在某些组件中使用两次类似模块的功能,如果这样,那么它会为该模块创建一个通用... js。但仍然问题依然存在,我无法访问懒加载模块中的共享服务。

是否有可能或任何人都可以指出我如何在懒加载模块中加载共享服务?

感谢

回答

1

如果你想从延迟加载模块的服务可作为全局单和随处可得,实现forRootAppModule进口MyLazyModule.forRoot()。这样提供者就被全局注册了,而其他的则被延迟加载。

有关更多详细信息,请参见https://angular.io/guide/ngmodule#configure-core-services-with-coremoduleforroot

+0

感谢您指向我的链接,但它没关系,如果我出口它的根或导入共享模块。因为所有共享服务都使用SharedModule中的共享模型,所以当我尝试为root导出服务时,它也会导出所有模型的根目录。 – Riy

1

我找到了解决方案。其中提到的agar documentation之前没有引起我的注意。

请勿在共享模块中指定应用程序范围内的单身人士providers。 A 延迟加载的模块导入该共享模块,使其自己的副本 服务。

你需要做的是不要从共享模块提供和服务。只需在延迟加载的模块中导入共享模块并从该加载的模块提供服务即可。

我希望这会帮助别人。

快乐编码。 :)

+0

有了这种方法,懒惰的加载模块可以共享相同的服务吗?当试图访问另一个模块设置的服务的公共属性时,我在懒惰加载的模块中得到了undefined。 – bomaboom