如何处理 TypeScript 中的闭包(角度注入)
How to handle closures in TypeScript (Angular injections)?
我在 JavaScript 中有一个 Angular 工厂服务,我定义如下:
app.service('MyServiceFactory', ['$http', '$timeout', '$interval',
function($http, $timeout, $interval) {
function MyService() {
// I can use all injected values here without additional efforts
}
this.Create = function() {
return new MyService();
}
}]);
现在我想把它转换成TypeScript:
module Services {
export class MyServiceFactory {
static $inject: string[] = ['$timeout', '$interval', '$http'];
constructor(
private timeout: angular.ITimeoutService,
private interval: angular.IIntervalService,
private http: angular.IHttpService) {
}
public create(): MyService { return new MyService(); };
}
export class MyService() {
// I have a problem here. I need to redefine and
// initialize all variables, injected into my factory class
}
angular.module('MyModule').service('MyServiceFactory', MyServiceFactory);
}
你明白我的意思吗?TypeScript 不允许嵌套类,这本可以解决问题。另外,TypeScript解决方案看起来很不酷。有没有更优雅的解决方案?
而不是 :
export class MyService() {
// I have a problem here. I need to redefine and
// initialize all variables, injected into my factory class
}
您可以将Create
放在MyServiceFactory
上,即:
module Services {
export class MyServiceFactory {
static $inject: string[] = ['$timeout', '$interval', '$http'];
constructor(
private timeout: angular.ITimeoutService,
private interval: angular.IIntervalService,
private http: angular.IHttpService) {
}
public create(){
// Use the revealing module pattern
// And let the compiler infer the return type
// e.g.
var foo = 23;
return {
foo
}
};
}
angular.module('MyModule').service('MyServiceFactory', MyServiceFactory);
}
请注意,有效的 JavaScript 是有效的 TypeScript (更多)
您可以将注入的变量作为参数传递给其他类,例如:
export class MyServiceFactory {
static $inject: string[] = ['$timeout', '$interval', '$http'];
constructor(
private timeout: angular.ITimeoutService,
private interval: angular.IIntervalService,
private http: angular.IHttpService) {
}
public create(): MyService {
return new MyService(this.timeout, this.interval, this.http);
}
}
export class MyService {
constructor(
private timeout: angular.ITimeoutService,
private interval: angular.IIntervalService,
private http: angular.IHttpService) {
// no more problems here, you can play with the injected variables again
}
}
angular.module('MyModule').service('MyServiceFactory', MyServiceFactory);
相关文章:
- 在underscorejs模板中使用闭包
- setTimeout可以与闭包内的函数一起使用吗
- 附加到原型属性的Do函数没有闭包
- 使用闭包共享构造函数参数
- 使用Google闭包编译器包含一个Ecmascript 6类
- 从js引擎的角度来看闭包和构造函数是如何工作的
- for循环中的JavaScript闭包
- Javascript闭包-如何防止内存泄漏
- 子类访问父类's闭包变量
- 闭包如何具体化数据封装
- Javascript.闭包和dynamic'这'实际上具有约束力
- 构造函数函数闭包变量
- 闭包js框架-将ArrayBuffer转换为字符串
- 如何在Angularjs中重构闭包中的重复代码
- 如何告诉闭包javascript编译器不要混淆webkitAudioContext的方法名称
- Google闭包和生成的getters/ssetter
- 如何冻结函数's在闭包中的变量
- 如何处理 TypeScript 中的闭包(角度注入)
- 闭包编译器高级和服务器端注入的Javascript
- 绑定函数而不是闭包以注入额外的参数