我正在使用TypeScript类在AngularJS中定义控制器:
class TrialsCtrl {
constructor(private $scope: ITrialsScope, private ResourceServices: ResourceServices) {
this.loadTrials();
}
loadTrials() {
console.log("TrialsCtrl:", this);
this.Trial.query().then((result) => {
this.$scope.Trials = result;
});
}
remove(Trial: IRestTrial) {
this.ResourceServices.remove(Trial, this.loadTrials);
}
}
angular.module("app").controller("TrialsCtrl", TrialsCtrl);
我正在将常用的控制器方法重构为服务。
class ResourceServices {
public remove(resource, reload) {
if (confirm("Are you sure you want to delete this?")) {
resource.remove().then(() => {
reload();
});
}
}
}
angular.module("app").service("ResourceServices", ResourceServices);
控制台日志显示this
在我希望它为TrialsCtrl
时引用窗口上下文。我的问题是reload()
方法需要在TrialsCtrl
的上下文中运行,以便它可以访问this.Trial
和this.$scope
。如何告诉reload()
方法将this
设置为TrialsCtrl
?或者我应该使用其他一些解决方法吗?
答案 0 :(得分:1)
你试过了吗?
this.ResourceServices.remove(Trial, this.loadTrials.bind(this));
或
this.ResourceServices.remove(Trial, () => this.loadTrials());
答案 1 :(得分:1)
对于应该作为回调传递的方法(与this.loadTrials
一样),最好将它们定义为箭头,
loadTrials = () => { ... }
因此,无论是否使用Function.prototype.bind
,他们都会保留上下文。
或者,可以在方法上使用装饰器(如core-decorators @autobind)来绑定方法,同时仍然在类原型上定义它:
@autobind
loadTrials() { ... }