Angular中$broadcast和$emit的使用方法详解

发布时间 - 2026-01-11 01:13:49    点击率:

要在控制器之间传递变量变化需要使用angular中的$broadcast和$emit方法来传递,同时使用$on来接收事件并作出响应。

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>

上述代码使用$watch监听parent的值的变化,当发生变化时就会“广播”出parentChange事件并传递了参数(输入框的值),此时子元素作用域中使用了$scope.$on("parentChange, handler)" 来接收parentChange事件,然后接受输入框的值并赋值给子作用域中的child变量。 这样就完成了值的传递。

效果:

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>

当子元素的child值发生变化时,会向上级发出childChange事件,此时父元素正在监听的$on(“childChange”)会做出响应,将传递的参数赋值给parent,整个流程与 broadcast类似。

效果:

上述作用域均存在层级关系,如果对于同级的作用域该如何做呢?

我们可以使用服务来广播事件:

<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>

我们在服务中运用了$rootScope,所有的作用域都从属于它,基于这点,我们可以在根作用域中广播事件,$rootScope.$broadcast("valueChange", n);,当每个子作用域中的值发生变化时我们都会调用服务中的change 方法来广播这个事件,同时每个作用域又都在监听$on("valueChange") 事件并作出相应处理,这样就实现了子作用域中的值会传递给兄弟作用域了。

效果为:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# emit  # broadcast  # angular  # AngularJS $on、$emit和$broadcast的使用  # Angularjs中的事件广播 —全面解析$broadcast  # $emit  # $on  # 方法来  # 输入框  # 译为  # 要在  # 我们可以  # 可以使用  # 时就  # 大家多多  # 会向  # 如何做  # 运用了  # 又都  # 实现了  # 完成了  # 使用了  # 从属于  # child  # app  # module  # controller 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  历史网站制作软件,华为如何找回被删除的网站?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  简历在线制作网站免费版,如何创建个人简历?  Java遍历集合的三种方式  如何用美橙互联一键搭建多站合一网站?  重庆市网站制作公司,重庆招聘网站哪个好?  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  如何用AI帮你把自己的生活经历写成一个有趣的故事?  进行网站优化必须要坚持的四大原则  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何在阿里云服务器自主搭建网站?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何快速搭建高效可靠的建站解决方案?  Laravel如何使用Blade组件和插槽?(Component代码示例)  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  如何在搬瓦工VPS快速搭建网站?  Laravel如何自定义错误页面(404, 500)?(代码示例)  如何为不同团队 ID 动态生成多个非值班状态按钮  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  如何快速使用云服务器搭建个人网站?  iOS发送验证码倒计时应用  如何在云指建站中生成FTP站点?  微信小程序 input输入框控件详解及实例(多种示例)  如何快速配置高效服务器建站软件?  Android自定义listview布局实现上拉加载下拉刷新功能  焦点电影公司作品,电影焦点结局是什么?  java中使用zxing批量生成二维码立牌  JavaScript常见的五种数组去重的方式  javascript中闭包概念与用法深入理解  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel怎么为数据库表字段添加索引以优化查询  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何在万网开始建站?分步指南解析  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成