AngularJS控制器之间的数据共享及通信详解


Posted in Javascript onAugust 01, 2016

AngularJS 本身已经提供了像指令 Directive 和 服务 Service 一类的方式,来实现数据和代码的共享和复用,但在实际的项目开发中,或许是处于懒惰,亦或是为了便利,总会想在两个控制器之间,直接进行数据的共享通信,或者是函数与方法的调用,这里我们就看看有哪些方法可以满足这个要求。

单例服务

单例服务是 AngularJS 本身支持的数据和代码共享方式,因为是单例的,所有的控制器访问的便是同一份数据。比如,下面的 Service 便可以实现:

angular
 .module('app')
 .service('ObjectService', [ObjectService]);
function ObjectService() {
 var list = {};
 return {
  get: function(id){
   return list[id];
  },
  set: function(id, v){
   list[id] = v;
  }
 };
}

在一个控制器中,调用 ObjectService.set('i', 1) 设置的数据,在其它控制器中,便可以通过 ObjectService.get('i') 来获取。

广播与事件

AngularJS 中在触发事件和发送广播时,都可以传递参数,可以通过这一特性,来实现数据的共享。与事件和广播相关的,共有三个方法,分别是:

    1.$emit():触发事件,它可以向上传递数据,比如,子控制器向父控制器,还有控制器向 $rootScope

    2.$broadcast():发送广播,它可以向下传递数据,比如,父控制器向子控制器传递数据,或者 $rootScope 向任意控制器传递数据

    3.$on():监听事件与广播,可以捕获 $emit $broadcast

可以将控制器之间的通信,分为三种情形:

    1.无直接关联的控制器:使用 $rootScope.$emit()、$rootScope.$boardcast() $scope.$emit 来发出数据,通过 $rootScope.$on() 来获取数据

    2.父控制器到子控制器:父控制器使用 $scope.$boradcast() 来发送数据,子控制器通过 $scope.$on() 来获取数据

    3.子控制器至父控制器:子控制器使用 $scope.$emit() 来发送数据,父控制器通过 $scope.$on() 来获取数据

下面是简单的用法:

// one controller
angular
 .module('app')
 .controller('OneController', ['$scope', OneController]);
function OneController($scope){
 var data = {value: 'test'};
 $rootScope.$broadcast('open.notice.editor', data);
}

// other controller
angular
 .module('app')
 .controller('AnotherController', ['$scope', AnotherController]);
function AnotherController($scope){
 $scope.$on('open.notice.editor', function(event, data){
  $scope.open(data);
  $scope.$emit('notice.editor.opened');
 });
}

父控制器

如果两个控制器共同拥有同一个父控制器,则可以通过父控制器来进行数据共享和通信。比如:

<div ng-controller="ParentController">
 <div ng-controller="ChildOneController"></div>
 <div ng-controller="ChildTwoController"></div>
</div>
// 父控制器
angular
 .module('app')
 .controller('ParentController', ['$scope', ParentController]);
function ParentController($scope){
 // 用于传递数据的变量
 $scope.data = null;
}

// 子控制器
angular
 .module('app')
 .controller('ChildOneController', ['$scope', ChildOneController]);
function ChildOneController($scope){
 // 数据设置
 $scope.$parent.data = 1;
}

// 子控制器
angular
 .module('app')
 .controller('ChildTwoController', ['$scope', '$timeout', ChildTwoController]);
function ChildTwoController($scope, $timeout){
 $timeout(function(){
  // 数据读取
  console.log($scope.$parent.data);
 }, 1000);
}

全局或共用的变量

AngularJS 提供了对 window localStorage 两个变量的封装,$window $localStorage ,通过修改和监听这两个值,可以达到在控制器之间数据共享和通信的目的。方法如下:

// one controller
angular
 .module('app')
 .controller('OneController', ['$scope', '$window', OneController]);
function OneController($scope, $window){
 // 数据设置
 $window.data = 1;
}

// other controller
angular
 .module('app')
 .controller('AnotherController', ['$scope', AnotherController]);
function AnotherController($scope){
 // 监听修改
 $scope.$watch(function(){
  return $window.data;
 }, function(n){
  $scope.windowData = n;
 });
}

其实,这种监听修改的方式,也可以用在其它通信方式中。

元素绑定

AngularJS 中,可以通过一个元素,来获取其上的控制器实例。通过这种方式便可以快速的获取
修改某个控制器中的数据,或者调用这个控制器中的方法。比如:

<div ng-controller="AppController">
 <div id="div-a"></div>
</div>

可以通过以下的方法,来获取控制器实例:

var instance = angular.element(document.getElementById('div-a')).scope();

接着,便可以通过这个 instance 来调用控制器的方法,获取和修改值了。无法是元素本身绑定有控制器,还是元素的父级元素绑定有控制器,都可以成功的获取。

本文关于Angular控制器之间的数据共享与通信就介绍到这了,对angularjs共享数据相关知识感兴趣的朋友可以一起学习,谢谢大家支持三水点靠木。

Javascript 相关文章推荐
JS控制文本框textarea输入字数限制的方法
Jun 17 Javascript
javascritp添加url参数将参数加入到url中
Sep 25 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
Nov 02 Javascript
如何利用Promises编写更优雅的JavaScript代码
May 17 Javascript
jQuery实现的tab标签切换效果示例
Sep 05 Javascript
Vue.js双向绑定操作技巧(初级入门)
Dec 27 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
Jun 25 Javascript
webpack vue项目开发环境局域网访问方法
Mar 20 Javascript
在vue中根据光标的显示与消失实现下拉列表
Sep 29 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
Jan 21 Javascript
vue 移动端记录页面浏览位置的方法
Mar 11 Javascript
js作用域及作用域链工作引擎
Jul 07 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
Aug 01 #Javascript
AngularJS基础 ng-href 指令用法
Aug 01 #Javascript
jQuery实现点击行选中或取消CheckBox的方法
Aug 01 #Javascript
AngularJS基础 ng-hide 指令用法及示例代码
Aug 01 #Javascript
使用JS中的exec()方法构造正则表达式验证
Aug 01 #Javascript
javascript创建含数字字母的随机字符串方法总结
Aug 01 #Javascript
jQuery简单实现彩色云标签效果示例
Aug 01 #Javascript
You might like
用php来检测proxy
2006/10/09 PHP
Ping服务的php实现方法,让网站快速被收录
2012/02/04 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
Python对象转换为json的方法步骤
2019/04/25 Python
python面试题之列表声明实例分析
2019/07/08 Python
布隆过滤器的概述及Python实现方法
2019/12/08 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
Java和Javasciprt的区别
2012/09/02 面试题
汽车专业学生自我评价
2014/01/19 职场文书
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
中学生操行评语
2014/04/24 职场文书
经济贸易专业自荐信
2014/06/11 职场文书
一份恶作剧的检讨书
2014/09/13 职场文书
优秀教师单行材料
2014/12/16 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
python中取整数的几种方法
2021/11/07 Python
python多线程方法详解
2022/01/18 Python
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android