Angularjs 将依赖项注入Typescript中的静态工厂
我有一个用typescript作为类编写的服务。在这个类中,我定义了一个静态工厂,我注入依赖项 当我压缩我的应用程序时,依赖项被压缩,我收到一个未定义的提供程序错误 这是我的服务:Angularjs 将依赖项注入Typescript中的静态工厂,angularjs,service,dependency-injection,typescript,factory,Angularjs,Service,Dependency Injection,Typescript,Factory,我有一个用typescript作为类编写的服务。在这个类中,我定义了一个静态工厂,我注入依赖项 当我压缩我的应用程序时,依赖项被压缩,我收到一个未定义的提供程序错误 这是我的服务: export class TInterceptor { public static $inject = ['$q', '$rootScope']; public static Factory($q:ng.IQService, $rootScope:ng.IRootScopeService) { retur
export class TInterceptor {
public static $inject = ['$q', '$rootScope'];
public static Factory($q:ng.IQService, $rootScope:ng.IRootScopeService)
{
return new TInterceptor($q, $rootScope);
}
constructor(private $q:ng.IQService, private $rootScope:ng.IRootScopeService){}...}
此处调用的服务:
angular
.module('t')
.config(config);
function config($httpProvider:ng.IHttpProvider)
{
$httpProvider.interceptors.push(TInterceptor.Factory);
}
我的问题是,如何确保在压缩代码时不覆盖依赖项?您有两种不同的选择: 1) 在config函数中定义它
function config(){...}
config.$inject = ['$httpProvider'];
2) 定义将函数添加到模块的时间
angular
.module('t')
.config(['$httpProvider', config]);
注册工厂。i、 e
angular.module('myapp').factory('interceptorFactory', ['$q','$rootScope',TInterceptor.Factory]);
并在配置块中提供工厂名称:
$httpProvider.interceptors.push('interceptorFactory');
或者也提供数组(猜测它应该和内部使用$injector.invoke
它不是字符串一样工作)
您还忘记了config
块上的显式注释
.config(['$httpProvider', config]);
编辑:Typescript 1.6的更新
既然Typescript 1.6已经推出,在支持类表达式的情况下,您可以直接使用带有闭包的类表达式来使用注入:
angular.module('myApp')
.factory('MyFactory', function($q, $http) {
return class {
constructor(data) {
// Here you have access to $q and $http
}
}
})
打字稿1.5 Typescript目前不允许类表达式,直到版本1.6,我个人现在使用以下语法:
class MyClass {
constructor(
private $q: ng.IQService,
private $http: ng.IHttpService
data) {
}
}
然后,我使用标准的Angular factory定义,该定义允许在构建期间使用ng annotate,并在返回类之前使用factory注入对类进行验证:
angular.module('myApp')
.factory('MyFactory', function($q, $http) {
var factory = MyClass
// Return curried MyClass
return Function.prototype.bind.apply(factory,
Array.prototype.concat.apply([factory], arguments))
});
回流管相当于:
return MyClass.bind(MyClass, $q, $http)
它的可读性较差,但会阻止您在每次更改依赖项时编写两次依赖项
或者,如果您有Lodash或下划线,您可以使用更优雅的方式:
return _.curry(MyClass).apply(this, arguments)
然后,我只能通过提供基本数据来实例化我的类:
new MyFactory(data)
new MyFactory(data)