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 相关文章推荐
浅谈javascript的数据类型检测
Jul 10 Javascript
javascript制作的简单注册模块表单验证
Apr 13 Javascript
使用AngularJS来实现HTML页面嵌套的方法
Jun 17 Javascript
JavaScript实现简单的tab选项卡切换
Jan 05 Javascript
Webpack 实现 AngularJS 的延迟加载
Mar 02 Javascript
详解Node.js模块间共享数据库连接的方法
May 24 Javascript
Ajax 加载数据 练习代码
Jan 05 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
Aug 24 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
Aug 27 jQuery
vue中beforeRouteLeave实现页面回退不刷新的示例代码
Nov 01 Javascript
创建nuxt.js项目流程图解
Mar 13 Javascript
JavaScript数组排序的六种常见算法总结
Aug 18 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
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
2013/01/06 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
最常用的12种设计模式小结
2011/08/09 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
js跨域请求数据的3种常用的方法
2015/12/01 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
JavaScript实现多态和继承的封装操作示例
2018/08/20 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
[44:10]2018DOTA2亚洲邀请赛 4.5 淘汰赛 EG vs VP 第一场
2018/04/06 DOTA
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
Python代码解决RenderView窗口not found问题
2016/08/28 Python
python 队列详解及实例代码
2016/10/18 Python
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
Flask框架钩子函数功能与用法分析
2019/08/02 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
python实现小世界网络生成
2019/11/21 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
使用Python解析Chrome浏览器书签的示例
2020/11/13 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
德国户外商店:eXXpozed
2020/07/25 全球购物
行政前台岗位职责
2013/12/04 职场文书
关于工资低的辞职信
2014/01/14 职场文书
法学个人求职信范文
2014/01/27 职场文书
高三政治教学反思
2014/02/06 职场文书
篮球比赛口号
2014/06/10 职场文书
中学后勤工作总结2015
2015/07/22 职场文书
安全教育主题班会总结
2015/08/14 职场文书