• angularJS控制器之间的相互通信方式、$broadcast、$emit、$on


    在项目中,我们可能会很经常性的利用到控制器之间的相互通信,在angular中的控制器之间的相互通信有以下几种方式:

    1)通过本地数据的存储localstorage,sessionstorage,

    2)通过rootScope,顶级作用域

    3)通过$broadcast,$on,$emit的方式进行通信

    在此就讲解下如何通过第三种方式进行通信的问题:

    $broadcast:顾名思义是广播的意思,一般用于父级控制器向子控制器传递信息的方法。

    $emit:主要是用于子控制器向父控制器传递信息的方法。

    $on:用于接收$broadcast,$emit的消息

    情况一:父---->子之间的通信($broadcast)

    <script src="../angular.js"></script>
    <script>
    angular.module("app", [])
        .controller("child", function($scope) {
            $scope.$on("parentChange", function(e, m) {//参数一:监听的事件名,回调函数的参数一:以对象的形式返回相关数据,参数二:你传递的参数
                $scope.change = "changed";
                $scope.child = m;
            })
        })
        .controller("parent", function($scope) {
            $scope.$watch("parent", function(n, o) {
                if (n == o) {
                    return;
                }
                $scope.$broadcast("parentChange", n)
            })
        })
    </script>
    
    <body>
        <div ng-controller="parent">
            Parent: {{parent}}
            <input type="text" ng-model="parent">
    
            <div ng-controller="child">
                {{change}} Child: {{child}}
            </div>
        </div>
    </body>

    情况二:子--->父的通信 ($emit)

    <script src="../angular.js"></script>
    <script>
    angular.module("app", [])
        .controller("parent", function($scope) {
            $scope.$on("childChange", function(e, m) {
                $scope.change = "changed";
                $scope.parent = m
            })
        })
        .controller("child", function($scope) {
            $scope.$watch("child", function(n, o) {
                if (n == o) {
                    return;
                }
                $scope.$emit("childChange", n)
            })
        })
    </script>
    
    
    <body ng-controller="parent">
        {{change}} Parent: {{parent}}
        <div ng-controller="child">
            Child: {{child}}
            <input type="text" ng-model="child">
        </div>
    </body>

    第三种:同级的兄弟控制器之间的相互通信(要额外定义一个服务)

    <script src="../angular.js"></script>
    <script>
    angular.module("app", [])
        .service("myServive", function($rootScope) {
            return {
                change: function(n) {
                    $rootScope.$broadcast("valueChange", n);
    
                }
            }
        })
        .controller("bro1", function($scope, myServive) {
            $scope.$watch("value1", function(n) {
                myServive.change(n);
            })
    
            $scope.$on("valueChange", function(e, m) {
                console.log("value1");
                $scope.value1 = m;
            })
        })
        .controller("bro2", function($scope, myServive) {
            $scope.$watch("value2", function(n) {
                myServive.change(n);
            })
    
            $scope.$on("valueChange", function(e, m) {
                console.log("value2");
                $scope.value2 = m;
            })
        })
    </script>
    
    
    <body>
        <div ng-controller="bro1">
            <h3> value1:</h3>
            <input type="text" ng-model="value1">
        </div>
        <div ng-controller="bro2">
            <h3>value2:</h3>
            <input type="text" ng-model="value2">
        </div>
    </body>

    同级控制器之间的相互通信,比起前面两种情况确实来的稍微复杂一点,但是本质上还是利用的上一级的控制器进行通信(以服务的方式)

    写这篇文章的原因就是在我的项目中我遇到了一个需求:我的页面中会用到angular-bootstrap的模态弹出框,现在要求模态框是没用内容的,通过z-index设置页面的内容(而非模态框)让其浮现到模态框上面(他有两个按钮),通过点击这两个按钮让模态框消失(已经设置模态框的backdtop:'static'),【之前都是点击模态框“确认”,“取消”按钮才消失模态框】,现在是通过点击页面的上的两个按钮(与模态框没有联系)让它消失。

    这个时候就需要通过同级控制器之间的相互通信。

  • 相关阅读:
    对于线程同步的浅薄理解
    线程安全之ConcurrentQueue<T>队列
    关于mybatis拦截器,对结果集进行拦截
    oracle 分析函数
    C# ikvm 运行htmlunit Provider com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl not found
    IronJs 无相关源?
    js div 内容显示分页
    JavascriptTAB切换 AND JqueryTAB切换
    php中mysql数据库操作类 -李盛鹏 -博客园
    sublime text 之snippet功能的使用 -李盛鹏 -博客园
  • 原文地址:https://www.cnblogs.com/evaling/p/7413851.html
Copyright © 2020-2023  润新知