我正在浏览本教程,以在我的Angular 1.5应用程序中实现发送/接收广播消息。
所以在控制器中我有一个:
update(){
this.$rootScope.$broadcast('language_changed');
}
在另一个控制器中,我得到了:
$rootScope.$on('language_changed', function (event, data){
this.updateStore(); <--- this here is undefined
});
}
updateStore() {
this.store = {
..
language_id: this.LanguageService.get(),
}
}
我想知道如何在广播中获得this
。这个技巧不起作用
您提供的答案不是一个适当的解决方案,您需要了解您在做什么,制作黑客不是解决方案。请阅读以下文章,以获取有关此和$范围之间差异的基本知识。
重要的是要了解角度事件:
$ emit-将事件发送到示波器的三个角度
$广播 - 在Angular三
下发送事件此外,请查看以下片段:片段
当您有两个控制器时,您无需$ $ $从$ rootscope播放活动,然后在$ rowotscope上听$,可以简单地在$示波器级别上聆听,$ rootscope依赖性注入不是需要。查看以下内容:
app.controller('DemoCtrl', function($scope, $rootScope) {
$scope.broadCastEvent = function() {
$rootScope.$broadcast('language_changed');
};
});
假设我们想在用户单击按钮时广播事件。该事件是从示波器的三个角度发送的,因此您正在收听此事件的控制器可以在范围上收听,而无需$ Rootscope依赖注入,类似的是:
app.controller('DemoCtrl2', function($scope) {
$scope.$on('language_changed', function() {
$scope.eventFired = !$scope.eventFired;
});
})
另一种情况是当您要$发射事件时(将其发送到Angular 3(,然后您需要将$ Rootscope注入将听取该事件的控制器,因为只有$ Rootscope可以在来自$ Rootscope的事件是 $ emit 。查看以下内容:
控制器$发射事件:
app.controller('DemoCtrl', function($scope, $rootScope) {
$scope.emitEvent = function() {
$rootScope.$emit('language_changed');
};
});
捕获事件的控制器:
app.controller('DemoCtrl2', function($scope, $rootScope) {
$rootScope.$on('language_changed', function() {
$scope.eventFired = !$scope.eventFired;
});
})
尝试使用片段玩一点,看看如果您想从$ rootscope发出$的事件,并尝试在$范围级别上捕捉它。
。希望这有点澄清。
解决方案很简单,使用JavaScript bind
hack:
$rootScope.$on('language_changed', function (event, data){
this.updateStore();
}.bind(this)); <-- bind makes the inner this same as outer this.. 😂