AngularJS控制器之间的通信方式详解


Posted in Javascript onNovember 03, 2016

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

一、利用作用域的继承方式

由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会影响到子作用域,反之,修改子作用域只会影响子作用域的值,不会影响父作用域上面的值;如果需要父作用域与子作用域共享一个值的话,就需要用到后面一种,即作用域上的值为对象,任何一方的修改都能影响另一方,这是因为在js中对象都是引用类型。

基本类型

function Sandcrawler($scope) {
  $scope.location = "Mos Eisley North";
  $scope.move = function(newLocation) {
    $scope.location = newLocation;
  }
}
function Droid($scope) {
  $scope.sell = function(newLocation) {
    $scope.location = newLocation;
  }
}

html:

<div ng-controller="Sandcrawler">
  <p>Location: {{location}}</p>
  <button ng-click="move('Mos Eisley South')">Move</button>
  <div ng-controller="Droid">
    <p>Location: {{location}}</p>
    <button ng-click="sell('Owen Farm')">Sell</button>
  </div>
</div>

对象

function Sandcrawler($scope) {
  $scope.obj = {location:"Mos Eisley North"};
}
function Droid($scope) {
  $scope.summon = function(newLocation) {
    $scope.obj.location = newLocation;
  }
}

html:

<div ng-controller="Sandcrawler">
  <p>Sandcrawler Location: {{location}}</p>
  <div ng-controller="Droid">
    <button ng-click="summon('Owen Farm')">
      Summon Sandcrawler
    </button>
  </div>
</div>

二、基于事件的方式

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

向上传播事件

function Sandcrawler($scope) {
  $scope.location = "Mos Eisley North";
  $scope.$on('summon', function(e, newLocation) {
    $scope.location = newLocation;
  });
}
function Droid($scope) {
  $scope.location = "Owen Farm";
  $scope.summon = function() {
    $scope.$emit('summon', $scope.location);
  }
}

html:

<div ng-controller="Sandcrawler">
  <p>Sandcrawler Location: {{location}}</p>
  <div ng-controller="Droid">
    <p>Droid Location: {{location}}</p>
    <button ng-click="summon()">Summon Sandcrawler</button>
  </div>
</div>

向下广播事件

function Sandcrawler($scope) {
  $scope.location = "Mos Eisley North";
  $scope.recall = function() {
    $scope.$broadcast('recall', $scope.location);
  }
}
function Droid($scope) {
  $scope.location = "Owen Farm";
  $scope.$on('recall', function(e, newLocation) {
    $scope.location = newLocation;
  });
}

html:

<div ng-controller="Sandcrawler">
  <p>Sandcrawler Location: {{location}}</p>
  <button ng-click="recall()">Recall Droids</button>
  <div ng-controller="Droid">
    <p>Droid Location: {{location}}</p>
  </div>
</div>

从这个用法我们可以引申出一种用于兄弟控制间进行通信的方法,首先我们一个兄弟控制中向父作用域触发一个事件,然后在父作用域中监听事件,再广播给子作用域,这样通过事件携带的参数,实现了数据经过父作用域,在兄弟作用域之间传播。这里要注意的是,通过父元素作为中介进行传递的话,兄弟元素用的事件名不能一样,否则会进入死循环。请看代码:

兄弟作用域之间传播

function Sandcrawler($scope) {
  $scope.$on('requestDroidRecall', function(e) {
    $scope.$broadcast('executeDroidRecall');
  });
}
function Droid($scope) {
  $scope.location = "Owen Farm";
  $scope.recallAllDroids = function() {
    $scope.$emit('requestDroidRecall');
  }
  $scope.$on('executeDroidRecall', function() { 
    $scope.location = "Sandcrawler"
  });
}

html:

<div ng-controller="Sandcrawler">
  <div ng-controller="Droid">
    <h2>R2-D2</h2>
    <p>Droid Location: {{location}}</p>
    <button ng-click="recallAddDroids()">Recall All Droids</button>
  </div>
  <div ng-controller="Droid">
    <h2>C-3PO</h2>
    <p>Droid Location: {{status}}</p>
    <button ng-click="recallAddDroids()">Recall All Droids</button>
  </div>
</div>

三、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 幻灯插件和教程
Mar 27 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
Nov 14 Javascript
js网页中的(运行代码)功能实现思路
Feb 04 Javascript
转换字符串为json对象的方法详解
Nov 29 Javascript
jquery form表单序列化为对象的示例代码
Mar 05 Javascript
一个不错的js html页面倒计时可精确到秒
Oct 22 Javascript
javascript实现动态统计图开发实例
Nov 21 Javascript
JavaScript中的遍历详解(多种遍历)
Apr 07 Javascript
深入理解Javascript中的作用域链和闭包
Apr 25 Javascript
js轮播图无缝滚动效果
Jun 17 Javascript
vue中实现左右联动的效果
Jun 22 Javascript
JavaScript 禁止用户保存图片的实现代码
Apr 28 Javascript
最细致的vue.js基础语法 值得收藏!
Nov 03 #Javascript
AngularJS创建自定义指令的方法详解
Nov 03 #Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
Nov 03 #Javascript
3种不同的ContextMenu右键菜单实现代码
Nov 03 #Javascript
利用纯Vue.js构建Bootstrap组件
Nov 03 #Javascript
jQuery下拉菜单的实现代码
Nov 03 #Javascript
AngularJS辅助库browserTrigger用法示例
Nov 03 #Javascript
You might like
php Static关键字实用方法
2010/06/04 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
2016/05/03 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
Python中的CURL PycURL使用例子
2014/06/01 Python
Python实现Youku视频批量下载功能
2017/03/14 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
Python3处理HTTP请求的实例
2018/05/10 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
班组长工作职责
2013/12/25 职场文书
最新奶茶店创业计划书范文
2014/02/08 职场文书
大学生简短的自我评价分享
2014/02/20 职场文书
护理学专业求职信
2014/06/29 职场文书
七夕活动策划方案
2014/08/16 职场文书
政府会议通知范文
2015/04/15 职场文书
家长通知书家长意见
2015/06/03 职场文书
纪录片信仰观后感
2015/06/08 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书