首先介绍一下我想要实现的目标。我有一项服务,在注入和使用之前需要一些配置。在做了一些研究后,我认为拥有该服务的提供者将是最好的解决方案。所以我根据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
}
}
答案 0 :(得分:1)
这里的主要问题,IHMO,是您正在尝试注册服务&amp;具有相同名称(CustomService
)的提供者。你不必这样做。
在您的情况下,您似乎只需要注册提供商。将您的CustomServiceProvider
课程重命名为CustomService
,然后将最后一行代码更改为:
angular
.module('custom', ['ngResource'])
.provider('CustomService', CustomService);
这样,在您的应用的config
阶段,您将能够注入CustomServiceProvider
(并使用setOptions
),还可以CustomService
注入控制器,指令&安培;其他服务。
请阅读Angular Documentation on providers(主要是“提供者食谱”)以获取更多信息。