我正在越过this tutorial在我的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
。 This trick没有工作
答案 0 :(得分:2)
您提供的答案不是一个正确的解决方案,您需要了解您在做什么,使黑客攻击不是一个解决方案。请阅读以下文章,以获得有关此范围与$ scope this vs $scope
之间差异的基本知识了解有关角度事件的重要事项:
$ emit - 将事件发送到角度范围的三个
$ broadcast - 按角度三发送事件
此外,请查看以下代码段:snippet
当你有两个控制器时,你不需要同时从$ rootScope广播这个事件并在$ rootScope上听它$,它可以简单地在$ scope级别上监听,$ 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;
});
})
另一种情况是当你想要$发出事件(将它发送到角度三)时,你需要将$ rootScope注入将要监听该事件的控制器,因为只有$ rootScope可以监听来自$ rootScope的 $ emit ed事件。请查看以下内容:
Controller $发出事件:
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发出事件并尝试在$ scope级别捕获它,会发生什么。
希望这能澄清一点。
答案 1 :(得分:1)
解决方案很简单,使用javascript bind
hack:
$rootScope.$on('language_changed', function (event, data){
this.updateStore();
}.bind(this)); <-- bind makes the inner this same as outer this..