AngularJS开发教程之控制器之间的通信方法分析


Posted in Javascript onDecember 25, 2016

本文实例讲述了AngularJS开发教程之控制器之间的通信方法。分享给大家供大家参考,具体如下:

一、指令与控制器之间通信,无非是以下几种方法:

基于scope继承的方式

基于event传播的方式

service的方式(单例模式)

二、基于scope继承的方式:

最简单的让控制器之间进行通信的方法是通过scope的继承。假设有两个控制器Parent、Child,Child 在 Parent 内,那Child 可以称为控制器Parent的子控制器,它将继承父控制器Parent的scope。这样,Child就可以访问到Parent的scope中的所有函数和变量了。

需要注意的是,由于scope的继承是基于Js的原型继承,如果变量是基本类型的,那在Child中的修改(写),有可能会导致Parent中的数据变脏。

例子:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>基于scope继承的方式</title>
</head>
<body ng-app = "myApp">
  <div ng-controller = "parent">
      <p>引用类型:{{obj.value}}</p>
      <p>引用类型:{{value}}</p>
      <a href="javascript:;" ng-click = "parent('parent')">点我</a>
    <div ng-controller="child">
      <p>引用类型:{{obj.value}}</p>
      <p>引用类型:{{value}}</p>
      <a href="javascript:;" ng-click = "child('child')">点我</a>
    </div>
  </div>
  <script type="text/javascript" src='http://cdn.staticfile.org/angular.js/1.3.0-beta.13/angular.min.js'></script>
  <script>
    var app = angular.module("myApp",[],function(){console.log("start")});
    app.controller("parent",function($scope){
      $scope.parent = function(newchild){
        // 这里不能都单独写成$scope.obj={value:newchild}
        $scope.obj={value:newchild};
        $scope.value = newchild;
      }
    });
    app.controller("child",function($scope){
      $scope.child = function(newchild){
        $scope.value = newchild;
        $scope.obj.value=newchild;
      }
    });
  </script>
</body>
</html>

三、基于事件的方式:

在一般情况下基于继承的方式已经足够满足大部分情况了,但是这种方式没有实现兄弟控制器之间的通信方式,所以引出了事件的方式 。基于事件的方式中我们可以里面作用的on,on,emit,boardcast这几个方式来实现,其中boardcast这几个方式来实现,其中on表示事件监听,emit表示向父级以上的作用域触发事件,emit表示向父级以上的作用域触发事件,boardcast表示向子级以下的作用域广播事件。

子到父 通过 $emit 注册事件,例子:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>基于事件传播子到父</title>
</head>
<body ng-app = "myApp">
  <h3>$on,$emit,$boardcast这几个方式来实现,其中$on表示事件监听,$emit表示向父级以上的 作用域触发事件, $boardcast表示向子级以下的作用域广播事件</h3>
  <div ng-controller = "parent">
      <p>引用类型:{{value}}</p>
    <div ng-controller="child">
      <a href="javascript:;" ng-click = "child('child')">子传值到父</a>
    </div>
  </div>
  <script type="text/javascript" src='http://cdn.staticfile.org/angular.js/1.3.0-beta.13/angular.min.js'></script>
  <script>
    var app = angular.module("myApp",[],function(){console.log("start")});
    app.controller("parent",function($scope){
      $scope.$on("pfan",function(e,data){
        $scope.value = data;
      })
    });
    app.controller("child",function($scope){
      $scope.child = function(newchild){
        $scope.value = newchild;
        $scope.$emit("pfan",$scope.value)
      }
    });
  </script>
</body>
</html>

父到子通过$broadcast注册事件,但其实感觉有点多余,本事父就是可以共享给子的,例子:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>基于事件传播父到子</title>
</head>
<body ng-app = "myApp">
  <h3>$on,$emit,$boardcast这几个方式来实现,其中$on表示事件监听,$emit表示向父级以上的 作用域触发事件, $boardcast表示向子级以下的作用域广播事件</h3>
  基于事件传播父到子,这里本事父就可以到子,感觉有点多余
  <div ng-controller = "parent">
      <a href="javascript:;" ng-click = "parent('child')">子传值到父</a>
    <div ng-controller="child">
      <p>引用类型:{{value}}</p>
    </div>
  </div>
  <script type="text/javascript" src='http://cdn.staticfile.org/angular.js/1.3.0-beta.13/angular.min.js'></script>
  <script>
    var app = angular.module("myApp",[],function(){console.log("start")});
    app.controller("parent",function($scope){
      $scope.parent = function(newchild){
        $scope.value = newchild;
        $scope.$broadcast("pfan",$scope.value)
      }
    });
    app.controller("child",function($scope){
      $scope.$on("pfan",function(e,data){
        $scope.value = data;
      })
    });
  </script>
</body>
</html>

同级之间

拥有同个父scope的子级scope之间,也就是兄弟/相邻scope之间的通信,其实是借助共同父级传递消息的:

子级scope中有谁想传消息了,emit一个给“奶爸”然后通过“奶爸”emit一个给“奶爸”然后通过“奶爸”broadcast 给所有孩子这个相同的信息,当然发出信息的那个可以选择是否要忽略掉自己发出的信息

四、angular服务的方式:

在ng中服务是一个单例,所以在服务中生成一个对象,该对象就可以利用依赖注入的方式在所有的控制器中共享。参照以下例子,在一个控制器修改了服务对象的值,在另一个控制器中获取到修改后的值:

var app = angular.module('myApp', []);
app.factory('instance', function(){
  return {};
});
app.controller('MainCtrl', function($scope, instance) {
 $scope.change = function() {
    instance.name = $scope.test;
 };
});
app.controller('sideCtrl', function($scope, instance) {
  $scope.add = function() {
    $scope.name = instance.name;
  };
});

html:

<div ng-controller="MainCtrl">
   <input type="text" ng-model="test" />
   <div ng-click="change()">click me</div>
</div>
<div ng-controller="sideCtrl">
  <div ng-click="add()">my name {{name}}</div>
</div>

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
jquery ui对话框实例代码
May 10 Javascript
简单实现限制uploadify上传个数
Nov 16 Javascript
JavaScript模块化开发之SeaJS
Dec 13 Javascript
AngularJs IE Compatibility 兼容老版本IE
Sep 01 Javascript
js仿支付宝多方框输入支付密码效果
Sep 27 Javascript
javascript实现二叉树的代码
Jun 08 Javascript
jQuery使用bind函数实现绑定多个事件的方法
Oct 11 jQuery
关于redux-saga中take使用方法详解
Feb 27 Javascript
layer 关闭指定弹出层的例子
Sep 25 Javascript
非常漂亮的js烟花效果
Mar 10 Javascript
vue大型项目之分模块运行/打包的实现
Sep 21 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
Nov 05 Javascript
使用jsonp实现跨域获取数据实例讲解
Dec 25 #Javascript
JavaScript中数据类型转换总结
Dec 25 #Javascript
javascript实现用户点击数量统计
Dec 25 #Javascript
jQuery扩展+xml实现表单验证功能的方法
Dec 25 #Javascript
js实现图片切换(动画版)
Dec 25 #Javascript
根据Bootstrap Paginator改写的js分页插件
Dec 25 #Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
Dec 25 #Javascript
You might like
在php中取得image按钮传递的name值
2006/10/09 PHP
解决GD中文乱码问题
2007/02/14 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
图片格式的JavaScript和CSS速查手册
2007/08/20 Javascript
javawscript 三级菜单的实现原理
2009/07/01 Javascript
Zero Clipboard js+swf实现的复制功能使用方法
2010/03/07 Javascript
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
jQuery 无刷新分页实例代码
2013/11/12 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
学习JavaScript图片预加载模块
2016/11/07 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
利用angular、react和vue实现相同的面试题组件
2018/02/19 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
Python中的map、reduce和filter浅析
2014/04/26 Python
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
在Python中的Django框架中进行字符串翻译
2015/07/27 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
python学习基础之循环import及import过程
2018/04/22 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
Python @property及getter setter原理详解
2020/03/31 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
高中家长寄语
2014/04/02 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
反邪教教育心得体会
2016/01/15 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS