ng-docs.github.io
ng-docs.github.io copied to clipboard
编译的library里的服务和application的服务是不通用的吗?
- 同时有 application和library两个类型项目(前者是正常开发者默认使用的类型,后者是发布给别人使用的时候用的)
- 在library中的服务其实已经在application的根模块声明了(并且都能正常调用),但是实际上运行会提示
ERROR Error: StaticInjectorError(AppModule)[TestComponent -> TestService]:
StaticInjectorError(Platform: core)[TestComponent -> TestService]:
NullInjectorError: No provider for TestService!
at NullInjector.push../node_modules/@angular/core/fesm5/core.js.NullInjector.get (core.js:1062)
at resolveToken (core.js:1300)
at tryResolveToken (core.js:1244)
at StaticInjector.push../node_modules/@angular/core/fesm5/core.js.StaticInjector.get (core.js:1141)
at resolveToken (core.js:1300)
at tryResolveToken (core.js:1244)
at StaticInjector.push../node_modules/@angular/core/fesm5/core.js.StaticInjector.get (core.js:1141)
at resolveNgModuleDep (core.js:8376)
at NgModuleRef_.push../node_modules/@angular/core/fesm5/core.js.NgModuleRef_.get (core.js:9064)
at resolveDep (core.js:9429)
- 然后为了研究到底是哪的问题,我把这个模块复制到了application项目里面一份,然后就正常了,
- 在我的认识中,除了懒加载(哪怕是懒加载,在根模块中声明了的服务,也会在懒加载中正常使用)是局部的, 直接声明在组件中的,剩下的都应该是全局的吧?那么为何在根模块中声明的服务无法在library中使用.
- 突然想到是不是变量提升的问题,于是就把需要注入的服务改成这样
constructor(@Inject(forwardRef(() => TestService)) private http: TestService) { }
结果还是不行, 6. 改成token传入,倒是能传入使用了,但是问题是两个实例,我就想用一个实例来共享一下信息,这么样也不行 7. 最后还是求大牛级的帮忙解惑,最近刚开始研究模块的编译,发现各种坑........
问题解决了 写6. 的时候想到,既然用token传,我直接传服务进去不就行了....然后果然可以了,
但是还是有点不明白,为何曾经说的根模块(非懒加载模块),只要导入,那么全局都能用的说法突然到今天不适用了,非要手动导入一次才行
我还没完全理解你的意思,建议你写个 live example 示范一下。就我现在的猜测分析如下:
根模块全局能用是建立在具有同一个 token 的基础上的,我怀疑你的写法可能在内存中出现了两个 TestService 的类地址(不是实例地址),因此无法当作同一个 Token。找都找不到自然也就无所谓几个实例了。
我还没完全理解你的意思,建议你写个 live example 示范一下。就我现在的猜测分析如下:
根模块全局能用是建立在具有同一个 token 的基础上的,我怀疑你的写法可能在内存中出现了两个 TestService 的类地址(不是实例地址),因此无法当作同一个 Token。找都找不到自然也就无所谓几个实例了。
@asnowwolf 可能是自己的问题......新开的项目都没这种问题......
@asnowwolf 100%终于找到问题啦,我可以说是遇到的最坑爹的一个问题 首先,我的理论没错,根模块声明的东西,在任何地方都可以调用 那么为何在library中出现问题,认为没有这个服务呢? 原因在于,library项目模块中我也用了个依赖包(普通项目依赖a包,library项目中也依赖a包,注意可以是peer依赖,但是不能是dependencies依赖),于是程序就可能认为我是在library里面找注入,结果就找不到啦(不过也让我知道了为啥要有peer这种依赖,)
另外注意! 即使你不是显式的依赖a导入的包,但是如果其他包依赖a包,并且其他包是dependencies,那么也会出现上述问题......... 啊啊啊啊啊啊啊啊啊啊,重要搞定了,再研究不出来就疯了
请问如何在library项目中引入第三方插件,类似于像再application项目中配置angular.json文件全局引入第三方的资源呢?