0

首先是我想要实现的一点背景。我有一项服务需要在注入和使用之前进行一些配置。在做了一些研究之后,我认为拥有该服务的提供商将是最好的解决方案。所以我根据这个例子实现了提供者。即使 Typescript 编译器(我正在使用 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 不是 Context 中的函数。[匿名]

此外,已编译的 JavaScript Visual Studio 代码在线上的提供程序变量上给了我一个绿色警告(我不认为这是一个错误).provider('CustomService', CustomServiceProvider);

'() => void' 类型的参数不能分配给'IServiceProvider' 类型的参数。类型“() => void”中缺少属性“$get”。
(local var) CustomServiceProvider: () => void
Providers

我已经花了几个小时来解决这个问题,但似乎找不到解决方案。关于如何解决我做错了什么的任何想法?

提前致谢。

编辑 (30-09-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
  }
}
4

1 回答 1

1

IHMO 这里的主要问题是您正在尝试注册一个具有相同名称 ( CustomService) 的服务和提供者。你不必这样做。

在您的情况下,您似乎只需要注册提供程序。将您的CustomServiceProvider类重命名为CustomService,然后将最后几行代码更改为:

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

这样,在config您的应用程序阶段,您将能够注入CustomServiceProvider(和使用setOptions),但也可以CustomService在控制器、指令和其他服务中。

请阅读有关提供程序的 Angular 文档(主要是“提供程序配方”)以获取更多信息。

于 2015-09-30T14:07:39.860 回答