参考'这个'在$ rootScope。$ on上为null

时间:2017-11-07 06:01:06

标签: angularjs typescript

在我的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);
}

我错过了什么?或者如何获得有关控制器实例的参考?

2 个答案:

答案 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));