在我的Typescript AngularJS控制器中声明了以下构造函数。
static $inject: Array<string> = [
'$rootScope',
'BookingRepository'
];
constructor(
$rootScope: ng.IRootScopeService,
bookingRepository: soft.data.BookingRepository
) {
super();
this.$rootScope = $rootScope;
this.$rootScope.$on('accessController_onNavAccessSelected', this.accessController_onNavAccessSelected);
this.bookingRepository = bookingRepository;
}
但是当调用accessController_onNavAccessSelected时,当我引用&#39;这个&#39;时我会变为空。我期待控制器的实例。
// Listening Events
accessController_onNavAccessSelected(event: ng.IAngularEvent, accessViewModel: soft.data.AccessViewModel): void {
console.log(this);
}
我错过了什么?或者如何获得有关控制器实例的参考?
答案 0 :(得分:4)
使用回调时关键字 this 的上下文会发生变化。
为防止这种情况,请添加 .bind(this):
this.$rootScope.$on('accessController_onNavAccessSelected', this.accessController_onNavAccessSelected.bind(this));
或只使用ES6的箭头功能:
accessController_onNavAccessSelected = (event: ng.IAngularEvent, accessViewModel: soft.data.AccessViewModel) => {
console.log(this);
}
答案 1 :(得分:1)
尝试以这种方式更改accessController_onNavAccessSelected
声明:
accessController_onNavAccessSelected = (event: ng.IAngularEvent, accessViewModel: soft.data.AccessViewModel): void => {
console.log(this);
}
或使用var self = this
解决方法:
var self = this;
accessController_onNavAccessSelected(event: ng.IAngularEvent, accessViewModel: soft.data.AccessViewModel): void {
console.log(self);
}
或者您可以在this
的帮助下强制指定您需要的bind
:
this.$rootScope.$on('accessController_onNavAccessSelected', this.accessController_onNavAccessSelected.bind(this));