Angular

时间:2015-09-30 13:15:09

标签: javascript angularjs typescript karma-mocha angular-providers

首先介绍一下我想要实现的目标。我有一项服务,在注入和使用之前需要一些配置。在做了一些研究后,我认为拥有该服务的提供者将是最好的解决方案。所以我根据this example实现了提供程序。甚至认为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的函数。[anonymous]

此外,已编译的JavaScript Visual Studio代码在行.provider('CustomService', CustomServiceProvider);

上的提供程序变量上给出了绿色警告(我认为这不是错误)
  

类型'()=&gt;的参数void'不能分配给'IServiceProvider'类型的参数。 '()=&gt;类型中缺少属性'$ get'无效”。
  (local var)CustomServiceProvider :()=&gt;无效
  提供商

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

提前致谢。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

这样,在您的应用的config阶段,您将能够注入CustomServiceProvider(并使用setOptions),还可以CustomService注入控制器,指令&安培;其他服务。

请阅读Angular Documentation on providers(主要是“提供者食谱”)以获取更多信息。