AngularJS事件传递

在AngularJS中,作用域是具有层次分明的结构。其中根层级也就是我们经常看到的$rootScope,其次是$Scope,$Scope是继承$rootScope的。在$Scope中的变量是不会共享或者说不能从另外一个原型继承的。

如此情况下,如何在作用域中建立通信的?其中一个方法就是创建一个服务$http,在不同的作用域中依靠这个服务进行通信。

另外一个方法也是我们今天要讲到的,就是通过作用域中的事件处理通信。但是这种方法是有局限性的,只能在兄弟父子层级中通信,不能同时传播到所有的作用域。

1.$emit
该服务贯穿作用域发出一个向上的事件,并通知哪些注册在rootScope.Scope上的监听器。(即只能向父级传播事件)

2.$broadcast
该服务发布一个向下的事件给作用域中的所有子节点以及以下的节点,并通知注册在
rootScope.Scope上的监听器。(即只能向子级传播事件)

3.$on
该服务监听指定类型的事件,获取从emit或者broadcast发布的事件。 (即接收事件)

举一个例子:

<div ng-controller="FatherCtrl">    //父元素
  <p>{{name}}</p>
  <div ng-controller="ChildCtrl1">    //子元素1
    <p ng-click="change()">{{name}}</p>
  </div>
  <div ng-controller="ChildCtrl2">    //子元素2
    <p >{{name}}</p>
  </div>
</div>

<script>
    var app = angular.module("myApp",[]);   
    app.controller('FatherCtrl',function($scope) {
      $scope.name = "father";
      $scope.$on("child",function(e){
        $scope.name = "接收子级child1传来的事件";
        $scope.$broadcast("down");
    });
  });
    app.controller('ChildCtrl1',function($scope) {
    $scope.name = "child1";
      $scope.change = function() {
        $scope.name = "child1";
            $scope.$emit("child");
      };
    });
  app.controller('ChildCtrl2',function($scope) {
        $scope.name = "child2";
        $scope.$on("down",function(e){
            $scope.name = "接收父级father传来的事件";
        });
  });
</script>

上述代码的流程是,点击子元素child1,子元素child1通过$emit传播事件到父元素,父元素father通过$on接收到子元素传播的事件后,通过$broadcast传播事件给子元素,子元素child1并没有用$on来接收事件,所以子元素child1不会有任何的变化,而子元素child2通过$on接收父元素传播的事件“down”,然后修改自身的$scope.name。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这是一个面试官问我的题目,当时没回答出来,主要是项目中没有碰到过这类问题,因此今天整理下查找到的资料,希望对大家有...
    一木_qintb阅读 766评论 0 2
  • 通过AngularJS仿豆瓣一刻的案例:https://github.com/zhongxiaolian/doub...
    中小恋阅读 1,802评论 1 21
  • Angular面试题 一、ng-show/ng-hide与ng-if的区别? 第一点区别是,ng-if在后面表达式...
    w_zhuan阅读 5,615评论 0 26
  • 1.类库( 提供类方法 ) 和框架 类库提供一系列的函数和方法的合集,能够加快你写代码的速度。但是主导逻辑的还是自...
    w_zhuan阅读 1,849评论 0 8
  • 笔记类文章 angularJS Scope综述 于2017年1月14日 翻译自angularjs 官网开发者指南 ...
    布蕾布蕾阅读 864评论 0 1