我有一个用打字稿写成的服务作为一个类。在这个类中,我定义了一个静态工厂,我注入了依赖项。
当我压缩我的应用程序时,依赖项正在被压缩,我收到一个未定义的提供程序错误。
这是我的服务:
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);
}
我的问题是,如何确保在压缩代码时保护依赖项不被覆盖?
答案 0 :(得分:1)
注册工厂。即,
angular.module('myapp').factory('interceptorFactory', ['$q','$rootScope',TInterceptor.Factory]);
并在配置块中提供工厂名称:
$httpProvider.interceptors.push('interceptorFactory');
或者也提供数组(猜测它应该工作,因为它在内部使用$injector.invoke
它不是字符串)
$httpProvider.interceptors.push(['$q','$rootScope', TInterceptor.Factory]);
您也忘记了config
块上的明确注释。
.config(['$httpProvider', config]);
答案 1 :(得分:0)
您有两种不同的选择:
1)在配置功能
上定义它function config(){...}
config.$inject = ['$httpProvider'];
2)定义何时将功能添加到模块
angular
.module('t')
.config(['$httpProvider', config]);
答案 2 :(得分:0)
既然Typescript 1.6已经出来了,并且支持类表达式,你可以直接使用带有闭包的类表达式来使用你的注入:
angular.module('myApp')
.factory('MyFactory', function($q, $http) {
return class {
constructor(data) {
// Here you have access to $q and $http
}
}
})
在版本1.6之前,Typescript不允许类表达式,我个人现在使用这种语法:
class MyClass {
constructor(
private $q: ng.IQService,
private $http: ng.IHttpService
data) {
}
}
然后我使用允许在构建期间使用ng-annotate的标准Angular工厂定义,并在返回之前使用工厂注入来对该类进行校准:
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或Underscore,您可以以更优雅的方式进行:
return _.curry(MyClass).apply(this, arguments)
然后我只能通过提供基本数据来实例化我的课程:
new MyFactory(data)