AngularJS - Passing data between pages
- You need to create a service to be able to share data between controllers.
- app.factory('myService', function() {
- var savedData = {}
- function set(data) {
- savedData = data;
- }
- function get() {
- return savedData;
- }
- return {
- set: set,
- get: get
- }
- });
- In your controller A:
- myService.set(yourSharedData);
- In your controller B:
- $scope.desiredLocation = myService.get();
- Remember to inject myService in the controllers by passing it as a parameter.
- 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.
- app.controller('AController', function ($scope, $rootScope) {
- $rootScope.varX = "XXX";
- });
- app.controller('BController', function ($scope, $rootScope) {
- console.log("$rootScope.varX:", $rootScope.varX);
- });
- 著作权归作者所有。
- 商业转载请联系作者获得授权,非商业转载请注明出处。
- 作者:Ye Huang
- 链接:http://www.zhihu.com/question/33565135/answer/69651500
- 来源:知乎
- 1. 基于ui-router的页面跳转传参(1) 在AngularJS的app.js中用ui-router定义路由,比如现在有两个页面,一个页面(producers.html)放置了多个producers,点击其中一个目标,页面跳转到对应的producer页,同时将producerId这个参数传过去。.state('producers', {
- url: '/producers',
- templateUrl: 'views/producers.html',
- controller: 'ProducersCtrl'
- })
- .state('producer', {
- url: '/producer/:producerId',
- templateUrl: 'views/producer.html',
- controller: 'ProducerCtrl'
- })
- (2) 在producers.html中,定义点击事件,比如ng-click="toProducer(producerId)",在ProducersCtrl中,定义页面跳转函数 (使用ui-router的$state.go接口):.controller('ProducersCtrl', function ($scope, $state) {
- $scope.toProducer = function (producerId) {
- $state.go('producer', {producerId: producerId});
- };
- });
- (3) 在ProducerCtrl中,通过ui-router的$stateParams获取参数producerId,譬如:.controller('ProducerCtrl', function ($scope, $state, $stateParams) {
- var producerId = $stateParams.producerId;
- });
- 2. 基于factory的页面跳转传参举例:你有N个页面,每个页面都需要用户填选信息,最终引导用户至尾页提交,同时后一个页面要显示前面所有页面填写的信息。这个时候用factory传参是比较合理的选择(下面的代码是一个简化版,根据需求可以不同定制):.factory('myFactory', function () {
- //定义factory返回对象
- var myServices = {};
- //定义参数对象
- var myObject = {};
- /**
- * 定义传递数据的set函数
- * @param {type} xxx
- * @returns {*}
- * @private
- */
- var _set = function (data) {
- myObject = data;
- };
- /**
- * 定义获取数据的get函数
- * @param {type} xxx
- * @returns {*}
- * @private
- */
- var _get = function () {
- return myObject;
- };
- // Public APIs
- myServices.set = _set;
- myServices.get = _get;
- // 在controller中通过调set()和get()方法可实现提交或获取参数的功能
- return myServices;
- });
- 3. 基于factory和$rootScope.$broadcast()的传参(1) 举例:在一个单页中定义了nested views,你希望让所有子作用域都监听到某个参数的变化,并且作出相应动作。比如一个地图应用,某个$state中定义元素input,输入地址后,地图要定位,同时另一个状态下的列表要显示出该位置周边商铺的信息,此时多个$scope都在监听地址变化。PS: $rootScope.$broadcast()可以非常方便的设置全局事件,并让所有子作用域都监听到。.factory('addressFactory', ['$rootScope', function ($rootScope) {
- // 定义所要返回的地址对象
- var address = {};
- // 定义components数组,数组包括街道,城市,国家等
- address.components = [];
- // 定义更新地址函数,通过$rootScope.$broadcast()设置全局事件'AddressUpdated'
- // 所有子作用域都能监听到该事件
- address.updateAddress = function (value) {
- this.components = value.slice();
- $rootScope.$broadcast('AddressUpdated');
- };
- // 返回地址对象
- return address;
- }]);
- (2) 在获取地址的controller中:// 动态获取地址,接口方法省略
- var component = {
- addressLongName: xxxx,
- addressShortName: xxxx,
- cityLongName: xxxx,
- cityShortName: xxxx
- };
- // 定义地址数组
- $scope.components = [];
- $scope.$watch('components', function () {
- // 将component对象推入$scope.components数组
- components.push(component);
- // 更新addressFactory中的components
- addressFactory.updateAddress(components);
- });
- (3) 在监听地址变化的controller中:// 通过addressFactory中定义的全局事件'AddressUpdated'监听地址变化
- $scope.$on('AddressUpdated', function () {
- // 监听地址变化并获取相应数据
- var street = address.components[0].addressLongName;
- var city = address.components[0].cityLongName;
- // 通过获取的地址数据可以做相关操作,譬如获取该地址周边的商铺,下面代码为本人虚构
- shopFactory.getShops(street, city).then(function (data) {
- if(data.status === 200){
- $scope.shops = data.shops;
- }else{
- $log.error('对不起,获取该位置周边商铺数据出错: ', data);
- }
- });
- });
- 4. 基于localStorage或sessionStorage的页面跳转传参注意事项:通过LS或SS传参,一定要监听变量,否则参数改变时,获取变量的一端不会更新。AngularJS有一些现成的WebStorage dependency可以使用,譬如gsklee/ngStorage · GitHub,grevory/angular-local-storage · GitHub。下面使用ngStorage来简述传参过程:(1) 上传参数到localStorage - Controller A// 定义并初始化localStorage中的counter属性
- $scope.$storage = $localStorage.$default({
- counter: 0
- });
- // 假设某个factory(此例暂且命名为counterFactory)中的updateCounter()方法
- // 可以用于更新参数counter
- counterFactory.updateCounter().then(function (data) {
- // 将新的counter值上传到localStorage中
- $scope.$storage.counter = data.counter;
- });
- (2) 监听localStorage中的参数变化 - Controller B$scope.counter = $localStorage.counter;
- $scope.$watch('counter', function(newVal, oldVal) {
- // 监听变化,并获取参数的最新值
- $log.log('newVal: ', newVal);
- });
http://www.zhihu.com/question/33565135
service 到底这么用?
...
AngularJS - Passing data between pages的更多相关文章
- [转]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 ...
- angular-ui-router state.go not passing data to $stateParams
app.js中定义了一个state如下,url接收一个id参数 $stateProvider.state("page.details", { url: "/details ...
- [AngularJS] Accessing Data in HTML -- controllerAs, using promises
<!DOCTYPE html> <html> <head> <title>Access Data From HTML</title> < ...
- AngularJS Tabular Data with Edit/Update/Delete
效果 首先,我们先建立一些数据,当然你可以从你任何地方读出你的数据 var app = angular.module('plunker', ['ui.bootstrap']); app.control ...
- [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 ...
- [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 ...
- [Angular 2] Passing data to components with 'properties'
Besides @Input(), we can also use properties on the @Component, to pass the data. import {Component, ...
- angularjs post data
//post json 时收不到数据,目前只找到方法post form形式的key-value值 //关键是设置 headers: { 'Content-Type': 'application/x- ...
- 3D Computer Grapihcs Using OpenGL - 07 Passing Data from Vertex to Fragment Shader
上节的最后我们实现了两个绿色的三角形,而绿色是直接在Fragment Shader中指定的. 这节我们将为这两个三角形进行更加自由的着色——五个顶点各自使用不同的颜色. 要实现这个目的,我们分两步进行 ...
随机推荐
- bean找不到异常
和这种的 原因: 这些都是因为bean注入的时候没有找个要注入的bean 解决办法: 1.查看dubbo文件中,暴露接口是否引入bean 2.如果有引入,查看引入路径和类是否存在.
- js 睡觉
js睡觉 function sleep(numberMillis) { var now = new Date(); var exitTime = now.getTime() + numberMilli ...
- App开发(Android与php接口)之:短信验证码
最近和同学们一起开发一个自主项目,要用到短信验证码,在网上搜索了很久,看到一个推荐贴,提到了很多不错的短信服务商.经过测试,帖子中提到的服务商他们的短信到达率和到达速度也都不错.最后,由于经费问题,我 ...
- CSS关于子元素设置了float属性后父元素高度为0的解释和解决方法
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- 远程连接redis
1.在ubuntu上的redis作为服务端,默认是打开的 在redis的配置文件redis.conf中,找到bind localhost注释掉. 注释掉本机,局域网内的所有计算机都能访问. bind ...
- react1
1.方法用() 里面的每个参数之间用,分隔2.对象(函数.数组)用{} 3.{/*注释...*/} 4 组件的生命周期可分成三个状态:Mounting:已插入真实 DOMUpdating:正在被重新 ...
- golang 管道
2.管道简介Golang的原子并发特性使得它很容易构造流数据管道,这使得Golang可有效的使用I/O和多CPU特性.本文提出一些关于管道的示例,在这个过程中突出了操作失败的微妙之处和介绍处理失败的具 ...
- 在linux上配置并创建JavaFX项目
本环境为linux配置,因为这里的JavaFX项目是为定制Oracle监控工具而写的.现Oracle已收购Java好几年,用它自己的产生监控自己的东西还是很兼容的.此处Eclipse 为4.5版本. ...
- js URL中文传参乱码
js: var searchVal = encodeURIComponent($.trim($('#js_search_val').val()));//搜索的值 encodeURIComponent( ...
- Excel公式学习
1.Left函数 (1)语法格式=left(text,num_chars) ,(text代表用来截取的单元格内容,num_chars代表从左开始截取的字符数): (2)示例:例如A1单元格内的文本为: ...