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库(迷你版)--自建js库总结
Nov 21 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
Sep 27 Javascript
用JS将搜索的关键字高亮显示实现代码
Nov 08 Javascript
原生javascript实现图片弹窗交互效果
Jan 12 Javascript
谈谈JavaScript中function多重理解
Aug 28 Javascript
JS文件上传神器bootstrap fileinput详解
Jan 28 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
Dec 08 Javascript
Vue 实现树形视图数据功能
May 07 Javascript
vue 动态绑定背景图片的方法
Aug 10 Javascript
详解微信小程序用定时器实现倒计时效果
Apr 30 Javascript
如何对react hooks进行单元测试的方法
Aug 14 Javascript
Vue使用Proxy代理后仍无法生效的解决
Nov 13 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获取MySql新增记录ID值的3种方法
2014/06/24 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
php输出形式实例整理
2020/05/05 PHP
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
JavaScript设计模式之适配器模式介绍
2014/12/28 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
Vue.js计算属性computed与watch(5)
2016/12/09 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
js实现3D旋转相册
2020/08/02 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
python os.rename实例用法详解
2020/12/06 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
学生拾金不昧表扬信
2014/01/21 职场文书
报关专员求职信范文
2014/02/22 职场文书
大学奖学金获奖感言
2014/08/15 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
小学生差生评语
2014/12/29 职场文书
保洁员岗位职责
2015/02/04 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle