如何在事件接收器角度内访问它

时间:2018-02-08 17:18:10

标签: javascript angularjs eventemitter angular1.6

我正在越过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(),

        }
  }

我想知道如何在广播中抓住thisThis trick没有工作

2 个答案:

答案 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..