Angular页面间切换及传值的4种方法


Posted in Javascript onNovember 04, 2016

本文实例为大家分享了Angular JS页面间切换及传值 的方法,供大家参考,具体内容如下Angular JS页面间切换及传值

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); 
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
查找Oracle高消耗语句的方法
Mar 22 Javascript
javascript实现页面内关键词高亮显示代码
Apr 03 Javascript
AngularJS基础学习笔记之控制器
May 10 Javascript
学习JavaScript设计模式(代理模式)
Dec 03 Javascript
javascript使用递归算法求两个数字组合功能示例
Jan 03 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
Sep 20 Javascript
vue判断input输入内容全是空格的方法
Mar 02 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
Sep 28 Javascript
js字符串倒序的实例代码
Nov 30 Javascript
Vue核心概念Getter的使用方法
Jan 18 Javascript
vue.js多页面开发环境搭建过程
Apr 24 Javascript
vant IndexBar实现的城市列表的示例代码
Nov 20 Javascript
AngularJS实现根据变量改变动态加载模板的方法
Nov 04 #Javascript
RGB和YUV 多媒体编程基础详细介绍
Nov 04 #Javascript
javascript设置文本框光标的方法实例小结
Nov 04 #Javascript
使用Curl命令查看请求响应时间方法
Nov 04 #Javascript
JS创建对象的写法示例
Nov 04 #Javascript
微信公众号支付H5调用支付解析
Nov 04 #Javascript
AngularJS用户选择器指令实例分析
Nov 04 #Javascript
You might like
php中用文本文件做数据库的实现方法
2008/03/27 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
PHP中比较时间大小实例
2014/08/21 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
RR vs IO BO3 第一场2.13
2021/03/10 DOTA
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
javaScript基础详解
2017/01/19 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
python引用DLL文件的方法
2015/05/11 Python
Python爬虫爬取美剧网站的实现代码
2016/09/03 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
Python 编程速成(推荐)
2019/04/15 Python
python实现人脸签到系统
2020/04/13 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
后勤工作职责
2013/12/22 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
Go获取两个时区的时间差
2022/04/20 Golang
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS