如何将服务注入服务提供者,其中服务在传递到提供者模块的模块中

时间:2018-03-27 12:28:23

标签: javascript angularjs dependency-injection

如何将共享模块中的服务注入我的核心模块?

我无法将PersistSettingsService注入LocalisationProvider本地化位于核心模块中,而Persist位于共享模块中,这些都是这样设置的。

const Core =
    angular
        .module('core', [Auth, Shared])
        .constant('moment', moment)
        .service('ModuleLazyLoaderService', ModuleLazyLoaderService)
        .service('PermissionsService', PermissionsService)
        .service('PersistSettingsService', PersistSettingsService)
        .provider('ModuleLazyLoaderState', ModuleLazyLoaderStateProvider)
        .provider('Localisation', LocalisationProvider)
        .config(config)
        .run(run);

我从共享中删除了很多,因为有很多项目添加到共享

const Shared = angular
    .module('shared', [])
    .service('PersistSettingsService', PersistSettingsService)

这导致

[$injector:modulerr] Failed to instantiate module app due to: Error: $injector:modulerr] Failed to instantiate module core due to: Error: [$injector:unpr] Unknown provider: PersistSettingsService

根据我的理解,共享应该包含在核心中,所以我应该能够将其注入。我已经尝试将其设置为提供者,但这并没有解决问题。

我有我的Provider类。

export default class LocalisationProvider {
    $get() {
        return {
             getDateFormat: () => this.getDateFormat(),
             getSetFormat: () => this.getSetFormat(),
             getTimeFormat: () => this.getTimeFormat(),
             setDateFormat: value => this.setDateFormat(value),
             setTimeFormat: value => this.setTimeFormat(value)
        }; 
    }

    constructor(PersistSettingsService) {
      'ngInject';
       this.persistSettingsService = PersistSettingsService;
   }
}

我确保所有'ngInject'都在场,任何帮助都会受到赞赏。

我创建了一个可复制的版本,但说实话,我不确定它们是否因为同样的原因而失败。

https://jsfiddle.net/panf8L6s/17/

1 个答案:

答案 0 :(得分:0)

您无法将服务注入提供程序本身。将服务注入提供者的$ get方法与将服务注入工厂相同,但不能直接将其注入提供者函数。

但是我通过将提供程序逻辑重构为服务然后将其注入我的提供者$ get方法来解决这个问题:

export default class LocalisationProvider {
  $get(LocalisationController) {
    'ngInject';
    this.localisationController = LocalisationController;
    this.getDateFormat = () => this.localisationController.getDateFormat();
    return {
      getDateFormat: () => this.getDateFormat(),
      getSetFormat: () => this.localisationController.getSetFormat(),
      getTimeFormat: () => this.localisationController.getSetFormat(),
      setDateFormat: value => this.localisationController.setDateFormat(value),
      setTimeFormat: value => this.localisationController.setTimeFormat(value)
    };
  }
}

getDateFormat在get和inside之外的原因是因为提供程序在模块加载阶段运行,而$ get在实例化你提供的服务时运行。