我构建了一个角度库,它有两种类型的服务(以及组件/模块)
图书馆私有的服务,用于消费者项目无法使用的内部功能(让我们称之为内部)
应该用于在图书馆的组件/模块和消费者项目之间移动数据的服务。(让他们称之为外部)
这两种情况都有点问题,因此每个案例都有一个部分。 对不起,很长的帖子。
注意每个库组件也是一个模块,以便有选择地导入所需的内容,而不是整个库
使用forRoot()
方法将模块打包,如下所示:
export class TestModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: TestModule,
providers: [ TestService ]
}
}
}
然后在消费者项目中app.module
TestModule.forRoot()
。
这里的一切都很好。
奇怪的是当我使用TestModule
中打包的组件的选择器作为视图子项时,我可以从外部访问私有属性。
以下是一些片段,以便更清楚地发生了什么:
<test-selector #testViewChild></test-selector>
@ViewChild('testViewChild') testViewChild;
this.testViewChild.testService.myTestValue = 'I was set in the test project'
最后一个片段来自TestModule中导出的TestComponent的typescript文件
constructor(private testService: TestService) {
this.testService.myTestValue = 'I was set in the library';
}
实际服务myTestValue === 'I was set in the test project'
任何人都知道为什么会这样?
这里事情更怪异。首次创建库时,它与gulp
捆绑在一起,但后来又切换到webpack
。如果我完全掌握了所有内容,那么必须通过消费者项目的app.module
提供库中定义的服务,然后由库和消费者项目组件使用这个全局服务实例。
切换到webpack
后,这些服务无法实例化,抛出关于没有提供者的服务的错误,虽然导出(在index.ts
中)但无法从消费者导入app.module
使用from 'test-library'
。解决方法是将路径设置为from '../../node_modules/test-library/......'
。但这只会遇到更多问题。
通过在库中使用提供程序,无法从使用者项目访问服务实例(除非上面的hack感觉完全错误)。
那么关于发生了什么的任何想法? 再次抱歉这篇长篇文章。 并且为了更好和更具描述性的标题,可以随意编辑。