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 相关文章推荐
JavaScript基本对象
Jan 11 Javascript
js自定义事件及事件交互原理概述(二)
Feb 01 Javascript
js解决弹窗问题实现班级跳转DIV示例
Jan 06 Javascript
js中this用法实例详解
May 05 Javascript
Webwork 实现文件上传下载代码详解
Feb 02 Javascript
js Canvas实现的日历时钟案例分享
Dec 25 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
Jan 18 Javascript
Angular脚手架开发的实现步骤
Apr 09 Javascript
npm的lock机制解析
Jun 20 Javascript
JS严格模式原理与用法实例分析
Apr 27 Javascript
JS实现简单贪吃蛇小游戏
Oct 28 Javascript
Vue项目打包部署到apache服务器的方法步骤
Feb 01 Vue.js
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版(3)
2006/10/09 PHP
一些常用的php函数
2006/12/06 PHP
PHP使用正则表达式清除超链接文本
2013/11/12 PHP
PHP生成条形图的方法
2014/12/10 PHP
PHP培训要多少钱
2017/06/06 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
javascript 保存文件到本地实现方法
2012/11/29 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
基于vue和react的spa进行按需加载的实现方法
2018/09/29 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
原生JS无缝滑动轮播图
2019/10/22 Javascript
vue实现购物车列表
2020/06/30 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
python 接口_从协议到抽象基类详解
2017/08/24 Python
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
python通过http下载文件的方法详解
2019/07/26 Python
Python实现代码统计工具
2019/09/19 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
Django ModelForm组件原理及用法详解
2020/10/12 Python
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
运动会通讯稿500字
2014/02/20 职场文书
出生证明公证书
2014/04/09 职场文书
婚前协议书怎么写
2014/04/15 职场文书
连带责任保证书
2014/04/29 职场文书
我的梦想演讲稿
2014/04/30 职场文书
房屋所有权证明
2014/10/20 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
2014年妇女工作总结
2014/12/06 职场文书
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript