Функция внутри провайдера не распознается Angular

Сначала немного предыстории того, чего я хочу достичь. У меня есть служба, которая требует некоторой настройки, прежде чем она будет внедрена и использована. Проведя некоторое исследование, я решил, что лучшим решением будет наличие поставщика услуг. Поэтому я реализовал провайдера в соответствии с этим примером. . Даже несмотря на то, что компилятор Typescript (я использую машинописный текст для компиляции своего кода в допустимый JavaScript) считает, что все в порядке, JavaScript не распознает функцию, доступную через провайдера, для установки некоторых параметров.

Мой код выглядит следующим образом (некоторый код был опущен или переименован по какой-то причине)

export interface ICustomServiceProvider extends ng.IServiceProvider {
  setOptions(options: ICustomOptions): void;
  $get($http, $window, $resource): ICustomService;
}

class CustomServiceProvider implements ICustomServiceProvider {
  private options: ICustomOptions;

  public $get($http, $window, $resource) {
    return new CustomService($http, $window, $resource);
  }

  public setOptions(options: ICustomOptions): void {
    this.options = options;
  }
}

angular.module('custom', ['ngResource'])
  .service('CustomService', CustomService)
  .provider('CustomService', CustomServiceProvider);

Проблема возникает при использовании провайдера в одном из моих модульных тестов (я использую Karma с Mocka для тестирования) и вызове функции setOptions. Что делается так.

describe('CustomService', function() {

  var provider: ICustomServiceProvider;
  var options: {hello: 'world'};

  beforeEach(inject(function($injector: ng.auto.IInjectorService) {
    provider = <ICustomServiceProvider> $injector.get('');
  }));

  it('CustomService provider test', function() {
    provider.setOptions(options);
  });
}

При запуске этого теста Karma выдает ошибку:

TypeError: provider.setOptions не является функцией в контексте.[анонимно]

Также скомпилированный код JavaScript Visual Studio дает мне зеленое предупреждение (я не думаю, что это ошибка) в переменной провайдера в строке .provider('CustomService', CustomServiceProvider);

Аргумент типа '() => void' нельзя присвоить параметру типа 'IServiceProvider'. Свойство '$get' отсутствует в типе '() => void'.
(local var) CustomServiceProvider: () => void
Providers

Я уже потратил часы на исправление этой проблемы, но не могу найти решение. Любая идея о том, как исправить это, что я делаю неправильно?

Заранее спасибо.

Изменить (30 сентября 2015 г.)

Сервис, о котором я говорю, выглядит так:

export interface ICustomService {
  // Some function definitions
}

class CustomService implements ICustomService {
  static $inject = ['$http', '$window', '$resource'];

  constructor(httpService: ng.IHttpService, windowService: ng.IWindowService, resourceService: ng.resource.IResourceService, options: ICustomOptions) {
    // Setting variables
  }
}

person Robin Hermans    schedule 30.09.2015    source источник


Ответы (1)


Основная проблема здесь, IHMO, заключается в том, что вы пытаетесь зарегистрировать услугу и провайдера с тем же именем (CustomService). Вам не нужно этого делать.

В вашем случае похоже, что вам просто нужно зарегистрировать провайдера. Переименуйте свой класс CustomServiceProvider в CustomService, затем измените последние строки кода просто на:

angular
    .module('custom', ['ngResource'])
    .provider('CustomService', CustomService);

Таким образом, на этапе config вашего приложения вы сможете внедрить CustomServiceProvider (и использовать setOptions), а также CustomService в контроллерах, директивах и других службах.

Пожалуйста, прочтите Документацию Angular по провайдерам (в основном "Рецепт провайдера") для получения дополнительной информации.

person Deurco    schedule 30.09.2015
comment
Я не уверен, смогу ли я просто переименовать его. У меня уже есть класс с именем CustomService, который создается и возвращается провайдером. Кроме того... они должны быть разными, поскольку я видел примеры, когда наименование службы и провайдера было идентичным. Затем Angular вставит для вас часть «поставщик». - person Robin Hermans; 30.09.2015