【问题标题】:how to access this inside an event receiver angular如何在事件接收器角度访问它
【发布时间】:2018-07-19 08:41:36
【问题描述】:

我正在使用 this tutorial 在我的 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(),

        }
  }

我想知道如何在广播中获取thisThis trick 没用

【问题讨论】:

  • 是否为上下控制器。你能把你的控制器代码和 HTML 放在控制器定义的地方吗?
  • 查看链接教程。考虑到我使用的是 $rootScope,控制器相对于彼此的放置是无关紧要的
  • 在没有这个的情况下尝试 updateStore()
  • 是的,我应该这样认为,因为当您向上调用事件时,您应该使用 $emit,而当您向下调用事件时,您应该使用 $broadcast。
  • 看答案的人

标签: javascript angularjs eventemitter angular1.6


【解决方案1】:

解决方案很简单,使用 javascript bind hack:

$rootScope.$on('language_changed', function (event, data){
    this.updateStore();
}.bind(this));  <-- bind makes the inner this same as outer this.. ?

【讨论】:

  • 我有一种感觉,一些有棱有角的纯粹主义者会在停车场等我,但要为此殴打我 ?
【解决方案2】:

您提供的答案不是正确的解决方案,您需要了解您在做什么,制作黑客不是解决方案。请阅读以下文章,了解有关 this 和 $scope this vs $scope的区别的基本知识

关于角度事件的重要知识:

$emit - 将事件向上发送到三角范围

$broadcast - 将事件发送到三角

另外,请看下面的sn-p: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;
   });
})

另一种情况是当您想要 $emit 事件(将其发送到角度三)时,您需要将 $rootScope 注入将侦听该事件的控制器,因为只有 $rootScope 可以侦听从 $rootScope $emited 的事件。查看以下内容:

控制器$发射事件:

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;
 });
})

试着玩一下 sn-p,看看如果你想从 $rootScope $emit 事件并尝试在 $scope 级别捕获它会发生什么。

希望这能澄清一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多