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 相关文章推荐
一行代码实现纯数据json对象的深度克隆实现思路
Jan 09 Javascript
动态创建script标签实现跨域资源访问的方法介绍
Feb 28 Javascript
jQuery中unbind()方法用法实例
Jan 19 Javascript
JavaScript中关键字 in 的使用方法详解
Oct 17 Javascript
Bootstrap框架实现广告轮播效果
Nov 28 Javascript
JQuery 选择器、DOM节点操作练习实例
Sep 28 jQuery
iview日期控件,双向绑定日期格式的方法
Mar 15 Javascript
Node.js中package.json中库的版本号(~和^)
Apr 02 Javascript
使用xampp将angular项目运行在web服务器的教程
Sep 16 Javascript
如何基于JavaScript判断图片是否加载完成
Dec 28 Javascript
2019最新21个MySQL高频面试题介绍
Feb 06 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
Sep 21 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
简单采集了yahoo的一些数据
2007/02/14 PHP
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
php的urlencode()URL编码函数浅析
2011/08/09 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
PHP 文件系统详解
2012/09/13 PHP
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
js图片翻书效果代码分享
2015/08/20 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
2020/07/15 Javascript
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
全面解读Python Web开发框架Django
2014/06/30 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
python装饰器使用实例详解
2019/12/14 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
中级会计职业生涯规划书
2014/03/01 职场文书
党风廉设责任书
2014/04/16 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
介绍信的格式
2015/01/30 职场文书
法律意见书范文
2015/06/04 职场文书
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android