在Typescript

时间:2015-06-03 19:04:35

标签: angularjs service dependency-injection typescript factory

我有一个用打字稿写成的服务作为一个类。在这个类中,我定义了一个静态工厂,我注入了依赖项。

当我压缩我的应用程序时,依赖项正在被压缩,我收到一个未定义的提供程序错误。

这是我的服务:

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);
  }

我的问题是,如何确保在压缩代码时保护依赖项不被覆盖?

3 个答案:

答案 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的更新

既然Typescript 1.6已经出来了,并且支持类表达式,你可以直接使用带有闭包的类表达式来使用你的注入:

angular.module('myApp')
    .factory('MyFactory', function($q, $http) {

        return class {

            constructor(data) {
                // Here you have access to $q and $http
            }
        }
    })

Typescript 1.5

在版本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)