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 相关文章推荐
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
Jan 22 Javascript
浏览器解析js生成的html出现样式问题的解决方法
Apr 16 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
Mar 11 Javascript
浅析Node.js中的内存泄漏问题
Jun 23 Javascript
react.js 翻页插件实例代码
Jan 19 Javascript
jquery实现input框获取焦点的简单实例
Jan 26 Javascript
Vue计算属性的学习笔记
Mar 22 Javascript
tab栏切换原理
Mar 22 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
Mar 20 Javascript
Node.js笔记之process模块解读
May 31 Javascript
vue安装和使用scss及sass与scss的区别详解
Oct 15 Javascript
jquery实现异步文件上传ajaxfileupload.js
Oct 23 jQuery
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
Smarty foreach控制循环次数的实现详解
2013/07/03 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
小程序实现五星点评效果
2018/11/03 Javascript
微信小程序自定义组件实现环形进度条
2020/11/17 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
2016/04/13 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
详解Python打包分发工具setuptools
2019/08/05 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
HTML5应用之文件上传
2016/12/30 HTML / CSS
猫途鹰:全球领先的旅游点评社区
2017/04/07 全球购物
英文简历中的自荐信范文
2013/12/14 职场文书
大学生表扬信范文
2014/01/09 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
全运会口号
2014/06/20 职场文书
大足石刻导游词
2015/02/02 职场文书
国庆节慰问信
2015/02/15 职场文书
公司仓库管理制度
2015/08/04 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers