Angular 控制器之间的数据共享与通信
撰写于 2016年7月28日修改于 2016年7月28日分类编程杂记标签AngularJS /JavaScript /前端 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; } }; } 在一个控制器中,调用 广播与事件AngularJS 中在触发事件和发送广播时,都可以传递参数,可以通过这一特性,来实现数据的共享。与事件和广播相关的,共有三个方法,分别是:
可以将控制器之间的通信,分为三种情形:
下面是简单的用法: // 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',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',ParentController]); function ParentController($scope){ // 用于传递数据的变量 $scope.data = null; } // 子控制器 angular .module('app') .controller('ChildOneController',ChildOneController]); function ChildOneController($scope){ // 数据设置 $scope.$parent.data = 1; } // 子控制器 angular .module('app') .controller('ChildTwoController','$timeout',ChildTwoController]); function ChildTwoController($scope,$timeout){ $timeout(function(){ // 数据读取 console.log($scope.$parent.data); },1000); } 全局或共用的变量AngularJS 提供了对 // one controller angular .module('app') .controller('OneController','$window',OneController]); function OneController($scope,$window){ // 数据设置 $window.data = 1; } // other controller angular .module('app') .controller('AnotherController',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(); 接着,便可以通过这个 茴字有很多写法,具体写的时候用哪种,完全看情况和心情。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Angularjs如何在切换路由时取消资源承诺
- Angular 5和CSS Grid – 无法找到网格区域 – 警告
- 单元测试 – 用茉莉花和羯磨测试模块化AngularJS
- scala – 如何同时获取ClassTag表单TypeTag或两者同时?
- WebService System.MissingMethodException "未找到成员
- 一图掌握bash shell编程
- twitter-bootstrap – 附加LESS的Bootstrap glyphicon,没有
- AngularJS进阶 十七 在AngularJS应用中实现微信认证授权遇到
- 在AngularJS中显示一个项目而不使用ng-repeat
- 源码编译安装LAMP