Angular - 服务不会从自定义库导出到使用者项目

时间:2017-11-14 17:16:23

标签: angular typescript webpack gulp

我构建了一个角度库,它有两种类型的服务(以及组件/模块)

  • 图书馆私有的服务,用于消费者项目无法使用的内部功能(让我们称之为内部

  • 应该用于在图书馆的组件/模块和消费者项目之间移动数据的服务。(让他们称之为外部

这两种情况都有点问题,因此每个案例都有一个部分。 对不起,很长的帖子。

注意每个库组件也是一个模块,以便有选择地导入所需的内容,而不是整个库

内部服务

使用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感觉完全错误)。

那么关于发生了什么的任何想法? 再次抱歉这篇长篇文章。 并且为了更好和更具描述性的标题,可以随意编辑。

0 个答案:

没有答案