Подходы к сервисам и компонентам в модулях Angular, предоставляемые библиотеками

Я думал, что понял модули Angular, но у меня возникли проблемы с определением наилучшего подхода к структурированию модулей, включающих службы и компоненты, предоставляемые библиотекой.

Библиотека реализует NotificationsComponent, который зависит от NotificationsService, который должен быть одноэлементным, поскольку он сохраняет информацию об уведомлении. Потребитель хочет использовать NotificationsComponent на разных страницах, некоторые из которых находятся внутри AdminPagesModules, а другие внутри BookPagesModule.

Скажем, в библиотеке я определяю NotificationsModule, который "объявляет" и "экспортирует" NotificationsComponent и "предоставляет" NotificationsService. Теперь, если я импортирую этот модуль и в AdminPagesModule, и в BookPagesModules, чтобы страницы в этих модулях могли использовать NotificationComponent, я получаю отдельные экземпляры NotificationsService, которые не будут работать. С другой стороны, если я импортирую NotificationsModule в свой AppModule, мне удастся убедиться, что NotificationsService является синглтоном, используемым во всем приложении, но я не вижу NotificationsComponent внутри компонентов внутри отдельных функциональных модулей, таких как AdminPagesModule.

Я видел шаблон, когда один модуль импортирует другой модуль, а затем реэкспортирует его. В этом случае мы бы импортировали NotificationsModule в AppModule, а затем повторно экспортировали его, а затем снова импортировали NotificationsModule в AdminPagesModule. В этом случае будет ли NotificationsService одноэлементным в приложении, как я хочу, но NotificationsComponent по-прежнему будет доступен для компонентов внутри AdminPagesModule?

Или есть подход к этой проблеме с использованием шаблона SharedModule?


person Community    schedule 07.07.2017    source источник


Ответы (1)


Лучше всего поместить одноэлементные службы в отдельный файл ts и импортировать/предоставлять один и только один раз либо в AppModule, либо в SharedModule, а не в компонентном модуле (например, библиотеке). Компоненты, объявленные в модулях, импортированных в AppModule, будут доступны в шаблонах во всем приложении, и их не нужно повторно объявлять или экспортировать.

Также см. https://stackoverflow.com/a/39665993/3103979

Пример услуг, предоставляемых в SharedModule:

export class SharedModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: SharedModule,
      providers: [
        ...
        ApiService,
        Auth,
        ...
      ]
    };
  }
}
person Dan    schedule 07.07.2017