1. You need to create a service to be able to share data between controllers.
  2.  
  3. app.factory('myService', function() {
  4. var savedData = {}
  5. function set(data) {
  6. savedData = data;
  7. }
  8. function get() {
  9. return savedData;
  10. }
  11.  
  12. return {
  13. set: set,
  14. get: get
  15. }
  16.  
  17. });
  18. In your controller A:
  19.  
  20. myService.set(yourSharedData);
  21. In your controller B:
  22.  
  23. $scope.desiredLocation = myService.get();
  24. Remember to inject myService in the controllers by passing it as a parameter.
  1. If you only need to share data between views/scopes/controllers, the easiest way is to store it in $rootScope. However, if you need a shared function, it is better to define a service to do that.
  1. app.controller('AController', function ($scope, $rootScope) {
  2. $rootScope.varX = "XXX";
  3. });
  4.  
  5. app.controller('BController', function ($scope, $rootScope) {
  6. console.log("$rootScope.varX:", $rootScope.varX);
  7. });
  1. 著作权归作者所有。
  2. 商业转载请联系作者获得授权,非商业转载请注明出处。
  3. 作者:Ye Huang
  4. 链接:http://www.zhihu.com/question/33565135/answer/69651500
  5. 来源:知乎
  6.  
  7. 1. 基于ui-router的页面跳转传参(1) AngularJSapp.js中用ui-router定义路由,比如现在有两个页面,一个页面(producers.html)放置了多个producers,点击其中一个目标,页面跳转到对应的producer页,同时将producerId这个参数传过去。.state('producers', {
  8. url: '/producers',
  9. templateUrl: 'views/producers.html',
  10. controller: 'ProducersCtrl'
  11. })
  12. .state('producer', {
  13. url: '/producer/:producerId',
  14. templateUrl: 'views/producer.html',
  15. controller: 'ProducerCtrl'
  16. })
  17. (2) producers.html中,定义点击事件,比如ng-click="toProducer(producerId)",在ProducersCtrl中,定义页面跳转函数 (使用ui-router$state.go接口):.controller('ProducersCtrl', function ($scope, $state) {
  18. $scope.toProducer = function (producerId) {
  19. $state.go('producer', {producerId: producerId});
  20. };
  21. });
  22. (3) ProducerCtrl中,通过ui-router$stateParams获取参数producerId,譬如:.controller('ProducerCtrl', function ($scope, $state, $stateParams) {
  23. var producerId = $stateParams.producerId;
  24. });
  25. 2. 基于factory的页面跳转传参举例:你有N个页面,每个页面都需要用户填选信息,最终引导用户至尾页提交,同时后一个页面要显示前面所有页面填写的信息。这个时候用factory传参是比较合理的选择(下面的代码是一个简化版,根据需求可以不同定制):.factory('myFactory', function () {
  26. //定义factory返回对象
  27. var myServices = {};
  28. //定义参数对象
  29. var myObject = {};
  30.  
  31. /**
  32. * 定义传递数据的set函数
  33. * @param {type} xxx
  34. * @returns {*}
  35. * @private
  36. */
  37. var _set = function (data) {
  38. myObject = data;
  39. };
  40.  
  41. /**
  42. * 定义获取数据的get函数
  43. * @param {type} xxx
  44. * @returns {*}
  45. * @private
  46. */
  47. var _get = function () {
  48. return myObject;
  49. };
  50.  
  51. // Public APIs
  52. myServices.set = _set;
  53. myServices.get = _get;
  54.  
  55. // 在controller中通过调set()和get()方法可实现提交或获取参数的功能
  56. return myServices;
  57.  
  58. });
  59. 3. 基于factory$rootScope.$broadcast()的传参(1) 举例:在一个单页中定义了nested views,你希望让所有子作用域都监听到某个参数的变化,并且作出相应动作。比如一个地图应用,某个$state中定义元素input,输入地址后,地图要定位,同时另一个状态下的列表要显示出该位置周边商铺的信息,此时多个$scope都在监听地址变化。PS: $rootScope.$broadcast()可以非常方便的设置全局事件,并让所有子作用域都监听到。.factory('addressFactory', ['$rootScope', function ($rootScope) {
  60. // 定义所要返回的地址对象
  61. var address = {};
  62.  
  63. // 定义components数组,数组包括街道,城市,国家等
  64. address.components = [];
  65.  
  66. // 定义更新地址函数,通过$rootScope.$broadcast()设置全局事件'AddressUpdated'
  67. // 所有子作用域都能监听到该事件
  68. address.updateAddress = function (value) {
  69. this.components = value.slice();
  70. $rootScope.$broadcast('AddressUpdated');
  71. };
  72.  
  73. // 返回地址对象
  74. return address;
  75. }]);
  76. (2) 在获取地址的controller中:// 动态获取地址,接口方法省略
  77. var component = {
  78. addressLongName: xxxx,
  79. addressShortName: xxxx,
  80. cityLongName: xxxx,
  81. cityShortName: xxxx
  82. };
  83.  
  84. // 定义地址数组
  85. $scope.components = [];
  86.  
  87. $scope.$watch('components', function () {
  88. // 将component对象推入$scope.components数组
  89. components.push(component);
  90. // 更新addressFactory中的components
  91. addressFactory.updateAddress(components);
  92. });
  93. (3) 在监听地址变化的controller中:// 通过addressFactory中定义的全局事件'AddressUpdated'监听地址变化
  94. $scope.$on('AddressUpdated', function () {
  95. // 监听地址变化并获取相应数据
  96. var street = address.components[0].addressLongName;
  97. var city = address.components[0].cityLongName;
  98.  
  99. // 通过获取的地址数据可以做相关操作,譬如获取该地址周边的商铺,下面代码为本人虚构
  100. shopFactory.getShops(street, city).then(function (data) {
  101. if(data.status === 200){
  102. $scope.shops = data.shops;
  103. }else{
  104. $log.error('对不起,获取该位置周边商铺数据出错: ', data);
  105. }
  106. });
  107. });
  108. 4. 基于localStoragesessionStorage的页面跳转传参注意事项:通过LSSS传参,一定要监听变量,否则参数改变时,获取变量的一端不会更新。AngularJS有一些现成的WebStorage dependency可以使用,譬如gsklee/ngStorage · GitHubgrevory/angular-local-storage · GitHub。下面使用ngStorage来简述传参过程:(1) 上传参数到localStorage - Controller A// 定义并初始化localStorage中的counter属性
  109. $scope.$storage = $localStorage.$default({
  110. counter: 0
  111. });
  112.  
  113. // 假设某个factory(此例暂且命名为counterFactory)中的updateCounter()方法
  114. // 可以用于更新参数counter
  115. counterFactory.updateCounter().then(function (data) {
  116. // 将新的counter值上传到localStorage中
  117. $scope.$storage.counter = data.counter;
  118. });
  119. (2) 监听localStorage中的参数变化 - Controller B$scope.counter = $localStorage.counter;
  120. $scope.$watch('counter', function(newVal, oldVal) {
  121. // 监听变化,并获取参数的最新值
  122. $log.log('newVal: ', newVal);
  123. });

http://www.zhihu.com/question/33565135

service 到底这么用?

...

AngularJS - Passing data between pages的更多相关文章

  1. [转]Passing data between pages in JQuery Mobile mobile.changePage

    本文转自:http://ramkulkarni.com/blog/passing-data-between-pages-in-jquery-mobile/ I am working on a JQue ...

  2. angular-ui-router state.go not passing data to $stateParams

    app.js中定义了一个state如下,url接收一个id参数 $stateProvider.state("page.details", { url: "/details ...

  3. [AngularJS] Accessing Data in HTML -- controllerAs, using promises

    <!DOCTYPE html> <html> <head> <title>Access Data From HTML</title> < ...

  4. AngularJS Tabular Data with Edit/Update/Delete

    效果 首先,我们先建立一些数据,当然你可以从你任何地方读出你的数据 var app = angular.module('plunker', ['ui.bootstrap']); app.control ...

  5. [React Native] Passing data when changing routes

    The way you make HTTP requests in React Native is with the Fetch API. In this video we'll talk about ...

  6. [Angular 2] Passing data to components with @Input

    @Input allows you to pass data into your controller and templates through html and defining custom p ...

  7. [Angular 2] Passing data to components with 'properties'

    Besides @Input(), we can also use properties on the @Component, to pass the data. import {Component, ...

  8. angularjs post data

    //post json 时收不到数据,目前只找到方法post form形式的key-value值 //关键是设置  headers: { 'Content-Type': 'application/x- ...

  9. 3D Computer Grapihcs Using OpenGL - 07 Passing Data from Vertex to Fragment Shader

    上节的最后我们实现了两个绿色的三角形,而绿色是直接在Fragment Shader中指定的. 这节我们将为这两个三角形进行更加自由的着色——五个顶点各自使用不同的颜色. 要实现这个目的,我们分两步进行 ...

随机推荐

  1. bean找不到异常

    和这种的 原因: 这些都是因为bean注入的时候没有找个要注入的bean 解决办法: 1.查看dubbo文件中,暴露接口是否引入bean 2.如果有引入,查看引入路径和类是否存在.

  2. js 睡觉

    js睡觉 function sleep(numberMillis) { var now = new Date(); var exitTime = now.getTime() + numberMilli ...

  3. App开发(Android与php接口)之:短信验证码

    最近和同学们一起开发一个自主项目,要用到短信验证码,在网上搜索了很久,看到一个推荐贴,提到了很多不错的短信服务商.经过测试,帖子中提到的服务商他们的短信到达率和到达速度也都不错.最后,由于经费问题,我 ...

  4. CSS关于子元素设置了float属性后父元素高度为0的解释和解决方法

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  5. 远程连接redis

    1.在ubuntu上的redis作为服务端,默认是打开的 在redis的配置文件redis.conf中,找到bind localhost注释掉. 注释掉本机,局域网内的所有计算机都能访问. bind ...

  6. react1

    1.方法用()  里面的每个参数之间用,分隔2.对象(函数.数组)用{} 3.{/*注释...*/} 4 组件的生命周期可分成三个状态:Mounting:已插入真实 DOMUpdating:正在被重新 ...

  7. golang 管道

    2.管道简介Golang的原子并发特性使得它很容易构造流数据管道,这使得Golang可有效的使用I/O和多CPU特性.本文提出一些关于管道的示例,在这个过程中突出了操作失败的微妙之处和介绍处理失败的具 ...

  8. 在linux上配置并创建JavaFX项目

    本环境为linux配置,因为这里的JavaFX项目是为定制Oracle监控工具而写的.现Oracle已收购Java好几年,用它自己的产生监控自己的东西还是很兼容的.此处Eclipse 为4.5版本. ...

  9. js URL中文传参乱码

    js: var searchVal = encodeURIComponent($.trim($('#js_search_val').val()));//搜索的值 encodeURIComponent( ...

  10. Excel公式学习

    1.Left函数 (1)语法格式=left(text,num_chars) ,(text代表用来截取的单元格内容,num_chars代表从左开始截取的字符数): (2)示例:例如A1单元格内的文本为: ...