ng-docs.github.io icon indicating copy to clipboard operation
ng-docs.github.io copied to clipboard

编译的library里的服务和application的服务是不通用的吗?

Open wszgrcy opened this issue 5 years ago • 5 comments

  1. 同时有 application和library两个类型项目(前者是正常开发者默认使用的类型,后者是发布给别人使用的时候用的)
  2. 在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)
  1. 然后为了研究到底是哪的问题,我把这个模块复制到了application项目里面一份,然后就正常了,
  2. 在我的认识中,除了懒加载(哪怕是懒加载,在根模块中声明了的服务,也会在懒加载中正常使用)是局部的, 直接声明在组件中的,剩下的都应该是全局的吧?那么为何在根模块中声明的服务无法在library中使用.
  3. 突然想到是不是变量提升的问题,于是就把需要注入的服务改成这样
constructor(@Inject(forwardRef(() => TestService)) private http: TestService) { }

结果还是不行, 6. 改成token传入,倒是能传入使用了,但是问题是两个实例,我就想用一个实例来共享一下信息,这么样也不行 7. 最后还是求大牛级的帮忙解惑,最近刚开始研究模块的编译,发现各种坑........

wszgrcy avatar Sep 18 '18 06:09 wszgrcy

问题解决了 写6. 的时候想到,既然用token传,我直接传服务进去不就行了....然后果然可以了,

但是还是有点不明白,为何曾经说的根模块(非懒加载模块),只要导入,那么全局都能用的说法突然到今天不适用了,非要手动导入一次才行

wszgrcy avatar Sep 18 '18 06:09 wszgrcy

我还没完全理解你的意思,建议你写个 live example 示范一下。就我现在的猜测分析如下:

根模块全局能用是建立在具有同一个 token 的基础上的,我怀疑你的写法可能在内存中出现了两个 TestService 的类地址(不是实例地址),因此无法当作同一个 Token。找都找不到自然也就无所谓几个实例了。

asnowwolf avatar Sep 18 '18 07:09 asnowwolf

我还没完全理解你的意思,建议你写个 live example 示范一下。就我现在的猜测分析如下:

根模块全局能用是建立在具有同一个 token 的基础上的,我怀疑你的写法可能在内存中出现了两个 TestService 的类地址(不是实例地址),因此无法当作同一个 Token。找都找不到自然也就无所谓几个实例了。

@asnowwolf 可能是自己的问题......新开的项目都没这种问题......

wszgrcy avatar Sep 18 '18 07:09 wszgrcy

@asnowwolf 100%终于找到问题啦,我可以说是遇到的最坑爹的一个问题 首先,我的理论没错,根模块声明的东西,在任何地方都可以调用 那么为何在library中出现问题,认为没有这个服务呢? 原因在于,library项目模块中我也用了个依赖包(普通项目依赖a包,library项目中也依赖a包,注意可以是peer依赖,但是不能是dependencies依赖),于是程序就可能认为我是在library里面找注入,结果就找不到啦(不过也让我知道了为啥要有peer这种依赖,)

另外注意! 即使你不是显式的依赖a导入的包,但是如果其他包依赖a包,并且其他包是dependencies,那么也会出现上述问题......... 啊啊啊啊啊啊啊啊啊啊,重要搞定了,再研究不出来就疯了

wszgrcy avatar Sep 18 '18 09:09 wszgrcy

请问如何在library项目中引入第三方插件,类似于像再application项目中配置angular.json文件全局引入第三方的资源呢?

traworduu avatar Nov 05 '19 08:11 traworduu