2015-10-19 76 views
0

我想用工厂来管理我的一些依赖注入,所以我在函数内部创建了一个本地类。我使用的JavaScript框架(AngularJS)会将函数的返回值注入到构造函数中。在工厂函数外部公开类型的本地TypeScript类

如何从工厂函数外引用返回类Record的类型?

/** Define factory to create Record classes */ 
export default function RecordFactory($window) { 
    return class Record { // I want to reference this class as a type 
    doSomething() { 
     // use $window service 
    } 
    } 

} 

/** 
* Controller for page with returned class of RecordFactory injected 
* into the constructor 
*/ 
class RecordPageCtrl { 
    record 
    constructor(Record) { // How do I specify the type of Record here? 
    this.record = new Record(); 
    } 
} 

// Dependency Injection is handled by AngularJS 
angular.module('myApp', []) 
    .factory('Record', RecordFactory) 
    .controller('RecordPageCtrl', RecordPageCtrl) 

注:我试图避免与维护上的所有Record类的方法的接口。

回答

0

这适用于我。

namespace Factored { 
    // Class Record wrapped in namespace only to distinguish from other Record usages 
    export class Record { // I want to reference this class as a type 
    doSomething() { 
     // use $window service 
    } 
    }; 
} 

/** Define factory to create Record classes */ 
export default function RecordFactory($window) { 
    return Factored.Record; // return class reference 
} 

/** 
* Controller for page with returned class of RecordFactory injected 
* into the constructor 
*/ 
class RecordPageCtrl { 
    record: Factored.Record; 
    constructor(Record: typeof Factored.Record) { // Referencing namespaced class 
    this.record = new Record(); 
    this.record.doSomething(); 
    } 
} 

// Dependency Injection is handled by AngularJS 
angular.module('myApp', []) 
    .factory('Record', RecordFactory) 
    .controller('RecordPageCtrl', RecordPageCtrl) 
+0

谢谢你的回应。但是,我不能重现这一点。我无法从Record类中访问注入的服务(例如'$ window')。 – Chic

0

我重新考虑了工厂是如何创建的,服务被注入类如Record。通过构造函数传递服务,工厂可以轻松地传递服务并允许AngularJS处理依赖注入。

/** Class where service needs to be injected */ 
class Record { 
    constructor(private myInjectedService) {} 
    doSomething() { 
     // use myService 
     this.myInjectedService.log('Hello World'); 
    } 
} 

/** Define factory to create Record class instances */ 
function RecordFactory(MyService) { 
    return new Record(MyService); // return a new class 
} 

/** 
* Controller for page 
* RecordFactory return variable is injected into the constructor 
*/ 
class RecordPageCtrl { 
    constructor(public Record: Record) { 
    this.Record.doSomething(); 
    } 
} 

/** Service to inject into Record class */ 
class MyService { 
    log(message: string) { 
     console.log(message); 
    } 
} 

let myServiceInst = new MyService(); 

// directly instantiated 
let factoryInstance = RecordFactory(myServiceInst); 
new RecordPageCtrl(factoryInstance); 

// Dependency Injection handled by AngularJS 
angular.module('myApp', []) 
    .factory('Record', RecordFactory) 
    .service('MyService', MyService) 
    .controller('RecordPageCtrl', RecordPageCtrl) 

注意,如果你希望能够创建Record类在工厂被注入的多个实例,您将需要有工厂返回另一家工厂叫时实例化的功能。