【问题标题】:Angular $emit, $on not workingAngular $emit,$on 不工作
【发布时间】:2017-11-12 02:16:43
【问题描述】:

我正在尝试学习 Angular 事件监听。用户单击按钮后,控制器会查询数据库并在按钮的处理程序中返回一个值。我无法将此值传递给$scope,以便其他函数可以访问数据。

第一个问题:这就是事件监听器的用途吗?有没有其他方法可以做我想做的事?

下一个问题:为什么这段代码不起作用:

app.controller('EmitterCtrl', function($scope) {
  console.log("Emitter controller.");

  $scope.buttonClick = function() {
    console.log("Button clicked!"); // this works
    $scope.$emit('myEvent', 'Clicked!'); // child $scope
  };

  $scope.$on('myEvent'), function(event, data) { // parent $scope
    console.log("I heard it!"); // doesn't work
    console.log(event);
    console.log(word);
  };

});

<div ng-controller="EmitterCtrl">
  <button type="button" ng-click="buttonClick()">
    Click me!
  </button>
</div>

用户单击按钮,事件处理程序在控制器中触发。处理程序创建一个子$scope,因此$emit 将事件发送给父$scope。然后不会发出事件,或者侦听器没有捕获它。

【问题讨论】:

  • 我做了一些测试,我的例子只有一个 $scope,所以 $emit 和 $on 在同一个 $scope 上。在我正在处理的项目中,处理程序($scope 函数)似乎创建了自己的子范围,但现在我发现这是错误的。我的项目肯定有其他问题。

标签: angularjs addeventlistener eventemitter


【解决方案1】:

$emit 向上调度一个事件 ... $broadcast 调度一个事件 向下

详细解释

$rootScope.$emit 只让其他$rootScope 听众捕捉到它。当您不希望每个 $scope 都得到它时,这很好。主要是高层次的交流。把它想象成成年人在一个房间里互相交谈,这样孩子们就听不到他们的声音了。

$rootScope.$broadcast 是一种让几乎所有人都能听到的方法。这相当于父母大喊晚餐准备好了,所以房子里的每个人都听到了。

$scope.$emit 是您希望$scope 及其所有父母和$rootScope 听到事件的时候。这是一个孩子在家里向父母抱怨(但不是在其他孩子能听到的杂货店)。

$scope.$broadcast 用于$scope 本身及其子项。这是一个孩子对它的毛绒玩具耳语,这样他们的父母就听不到了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2020-04-29
    • 2020-04-16
    • 2022-10-17
    相关资源
    最近更新 更多