angularjs 多页面应用用 location 设置和判断在哪个页面

angularjs项目需要从一个页面跳转到另一个页面,同时需要传递一个参数。请问大神该通过什么实现?
angularjs可以做页面带参跳转吗?我开发的项目中需要简单的几个页面跳转。现在需要从一个页面跳转到另一个页面,同时需要传递一个参数。请问这样需要通过什么实现?
Angular页面传参有多种办法,根据不同用例,我举5种最常见的(请在网页版知乎浏览答案):PS:
在实际项目中,请参照优化您的代码。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的页面跳转传参Demo: 举例:你有N个页面,每个页面都需要用户填选信息,最终引导用户至尾页提交,同时后一个页面要显示前面所有页面填写的信息。这个时候用factory传参是比较合理的选择(下面的代码是一个简化版,根据需求可以不同定制):.factory('myFactory', function () {
//定义参数对象
var myObject = {};
* 定义传递数据的setter函数
* @param {type} xxx
* @returns {*}
* @private
var _setter = function (data) {
myObject = data;
* 定义获取数据的getter函数
* @param {type} xxx
* @returns {*}
* @private
var _getter = function () {
return myObject;
// Public APIs
// 在controller中通过调setter()和getter()方法可实现提交或获取参数的功能
setter: _setter,
getter: _getter
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 = angular.copy(value);
$rootScope.$broadcast('AddressUpdated');
// 返回地址对象
return address;
(2) 在获取地址的controller中:// 动态获取地址,接口方法省略
var component = {
addressLongName: xxxx,
addressShortName: xx,
cityLongName: xxxx,
cityShortName: xx,
countryLongName: xxxx,
countryShortName: xx,
postCode: xxxxx
// 定义地址数组
$scope.components = [];
$scope.$watch('components', function () {
// 将component对象推入$ponents数组
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;
$log.error('对不起,获取该位置周边商铺数据出错: ', data);
4. 基于localStorage或sessionStorage的页面跳转传参注意事项:通过LS或SS传参,一定要监听变量,否则参数改变时,获取变量的一端不会更新。AngularJS有一些现成的WebStorage dependency可以使用,譬如,。下面使用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);
5. 基于localStorage/sessionStorage和Factory的页面传参由于传参出现的不同的需求,将不同方式组合起来可帮助你构建低耦合便于扩展和维护的代码。举例:应用的Authentication(授权)。用户登录后,后端传回一个时限性的token,该用户下次访问应用,通过检测token和相关参数,可获取用户权限,因而无须再次登录即可进入相应页面(Automatically Login)。其次所有的APIs都需要在HTTP header里注入token才能与服务器传输数据。此时我们看到token扮演一个重要角色:(a)用于检测用户权限,(b)保证前后端数据传输安全性。以下实例中使用和。(1)定义一个名为auth.service.js的factory,用于处理和authentication相关的业务逻辑,比如login,logout,checkAuthentication,getAuthenticationParams等。此处略去其他业务,只专注Authentication的部分。(function() {
'use strict';
.module('myApp')
.factory('authService', authService);
/** @ngInject */
function authService($http, $log, $q, $localStorage, PermissionStore, ENV) {
var apiUserPermission = ENV.baseUrl + 'user/permission';
var authServices = {
login: login,
logout: logout,
getAuthenticationParams: getAuthenticationParams,
checkAuthentication: checkAuthentication
return authServices;
////////////////
* 定义处理错误函数,私有函数。
* @param {type} xxx
* @returns {*}
* @private
function handleError(name, error) {
return $log.error('XHR Failed for ' + name + '.\n', angular.toJson(error, true));
* 定义login函数,公有函数。
* 若登录成功,把服务器返回的token存入localStorage。
* @param {type} xxx
* @returns {*}
function login(loginData) {
var apiLoginUrl = ENV.baseUrl + 'user/login';
return $http({
method: 'POST',
url: apiLoginUrl,
username: loginData.username,
password: loginData.password
.then(loginComplete)
.catch(loginFailed);
function loginComplete(response) {
if (response.status === 200 && _.includes(response.data.authorities, 'admin')) {
// 将token存入localStorage。
$localStorage.authtoken = response.headers().authtoken;
setAuthenticationParams(true);
$localStorage.authtoken = '';
setAuthenticationParams(false);
function loginFailed(error) {
handleError('login()', error);
* 定义logout函数,公有函数。
* 清除localStorage和PermissionStore中的数据。
function logout() {
$localStorage.$reset();
PermissionStore.clearStore();
* 定义传递数据的setter函数,私有函数。
* 用于设置isAuth参数。
* @param {type} xxx
* @returns {*}
* @private
function setAuthenticationParams(param) {
$localStorage.isAuth = param;
* 定义获取数据的getter函数,公有函数。
* 用于获取isAuth和token参数。
* 通过setter和getter函数,可以避免使用第四种方法所提到的$watch变量。
* @param {type} xxx
* @returns {*}
function getAuthenticationParams() {
var authParams = {
isAuth: $localStorage.isAuth,
authtoken: $localStorage.authtoken
return authParams;
* 第一步: 检测token是否有效.
* 若token有效,进入第二步。
* 第二步: 检测用户是否依旧属于admin权限.
* 只有满足上述两个条件,函数才会返回true,否则返回false。
* 请参看angular-permission文档了解其工作原理/Narzerus/angular-permission/wiki/Managing-permissions
function checkAuthentication() {
var deferred = $q.defer();
$http.get(apiUserPermission).success(function(response) {
if (_.includes(response.authorities, 'admin')) {
deferred.resolve(true);
deferred.reject(false);
}).error(function(error) {
handleError('checkAuthentication()', error);
deferred.reject(false);
return deferred.promise;
(2)定义名为index.run.js的文件,用于在应用载入时自动运行权限检测代码。(function() {
'use strict';
.module('myApp')
.run(checkPermission);
/** @ngInject */
* angular-permission version 3.0.x.
* /Narzerus/angular-permission/wiki/Managing-permissions.
* 第一步: 运行authService.getAuthenticationParams()函数.
* 返回true:用户之前成功登陆过。因而localStorage中已储存isAuth和authtoken两个参数。
* 返回false:用户或许已logout,或是首次访问应用。因而强制用户至登录页输入用户名密码登录。
* 第二步: 运行authService.checkAuthentication()函数.
* 返回true:用户的token依旧有效,同时用户依然拥有admin权限。因而无需手动登录,页面将自动重定向到admin页面。
* 返回false:要么用户token已经过期,或用户不再属于admin权限。因而强制用户至登录页输入用户名密码登录。
function checkPermission(PermissionStore, authService) {
PermissionStore
.definePermission('ADMIN', function() {
var authParams = authService.getAuthenticationParams();
if (authParams.isAuth) {
return authService.checkAuthentication();
return false;
(3)定义名为authInterceptor.service.js的文件,用于在所有该应用请求的HTTP requests的header中注入token。关于AngularJS的Interceptor,请参看。(function() {
'use strict';
.module('myApp')
.factory('authInterceptorService', authInterceptorService);
/** @ngInject */
function authInterceptorService($q, $injector, $location) {
var authService = $injector.get('authService');
var authInterceptorServices = {
request: request,
responseError: responseError
return authInterceptorServices;
////////////////
// 将token注入所有HTTP requests的headers。
function request(config) {
var authParams = authService.getAuthenticationParams();
config.headers = config.headers || {};
if (authParams.authtoken) config.headers.authtoken = authParams.authtoken;
return config || $q.when(config);
function responseError(rejection) {
if (rejection.status === 401) {
authService.logout();
$location.path('/login');
return $q.reject(rejection);
搬运工: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;
In your controller A:myService.set(yourSharedData);
In your controller B:$scope.desiredLocation = myService.get();
Remember to inject myService in the controllers passing it as a parameter.
如果你的需求是在url上带参数,最快捷的方法是$location.url()。如果用到ui-router,可以用$state.go()
从一个页面跳转到另一个页面,这是 View 层的变化,而数据是与 View 无关的,因此最好方式是将数据保存 Service 中,使得不同 Controller 之间共享数据。
1.可以通过rootscope传递。2.可以通过url后面带参数传递。
把参数存到window的session里面? 然后在新的window里把session里的参数提出来.
angular本来就只是专长做单页面,页面与页面的切换不是关注的重点
已有帐号?
无法登录?
社交帐号登录web前端(20)
angularjs location封装了浏览器原生的location对象,提供了很多方便的方法。
本文的angularjs版本是
location是什么?
location是一个关于当前网页地址的对象,从属于window之下,当然,window之下的对象在不引起歧义或者混淆的情况下,一般是可以省去window的。location本身是一个js对象,包含一些属性和方法。具体可以参考。
angular location
angular中的location是一个service,写作$location。
getter和setter方法
getter方法用于获取对象的私有属性,setter用于设置对象的私有属性。
js中是不存在私有变量的,但是通过一些命名方式(如私有变量名以双下划线开始)约定,可以人为的规定某些变量为私有变量。
正因为js本身不支持私有变量,所以对象的属性我们都可以通过 object.variable的方式读取。getter和setter方法只是我们为了让js对象的操作更加规范。例如,可以在setter方法中做一些规则校验,在getter方法中做一些初始化,等等。
注:如果方法没有参数说明或者示例,表示不需要参数。
getter:返回完整url。
getter:返回hash段。
setter:设置hash段并返回location。如location.hash(‘xxx’)。
getter:返回host。
getter:返回路径。, path就是123。
setter:设置路径。$location.path(‘/124’)。
getter:返回端口号。
protocol()
getter:返回协议名,如https。
search指的是url的query部分。
window.location.search会返回包括?的部分,个人认为十分不方便解析。
假设url为:,
getter: 返回search对象
getter返回对象:{name:’remind’,gender:’male’}。
setter: 设置query,有两种方式。
1. location.search(′name′,′remind′);location.search(‘gender’,’male’);
这种方法是部分更新(part update)。
如果在一个angular周期中,只更新其中一个,如只执行
$location.search(‘name’,’remind’)
那么gender会自动设置成空,如:
location.search(name:′remind′,gender:′male′);这种方法是全体更新(wholeupdate)。如果在一个angular周期中,执行location.search({name:’remind’});
那么gender会被删除,如 :
可以发现,设置方法类似jquery设置css的方式,对比一下.
遗憾的是search不支持查询某个特定值,例如location.search(‘name′),返回location对象而不是期待的name值。
当调用$location.path(‘xxx’)使得地址变更时,以下事件会被广播出去,在angular的作用域(scope)中可以监听到此类事件。
$locationChangeStart
在$location的path change之后,url change发生改变之前,此事件被广播出去。url change可以被阻止,方法是调用此事件的preventDefault方法。
$locationChangeSuccess
当url change之后,此event被广播出去。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7254次
排名:千里之外
原创:36篇
(1)(2)(3)(4)(6)(2)(1)(2)(3)(2)(3)(1)(1)(1)(1)(1)(3)1311人阅读
AngularJs(3)
之前有个判断在那个页面上的问题困扰了我很久~后来查了很久的文档才找到的$location这个注入的Service,和大家分享下拉~省的你们找啦~
当然可以用window.location来达到同样的目的。
我是不是棒棒哒?~
前方高能。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
这是AngularJS 介绍$location的网址啦(想阅读先翻墙):https://docs.angularjs.org/guide/$location
言归正传。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
直接看官网的例子吧
1&首先:这是Getter and setter 方法的使用。
// get the current path
$location.path();
// change the path
$location.path('/newValue')也可以变形使用啦~
//Change multiple segments in one go, chain setters like this:
$location.path('/newValue').search({key: value});
2&Replace method(中文可能翻译成替代方法)
即,把原来的位置替换成别的
$location.path('/someNewPath');
$location.replace();
// or you can chain these as: $location.path('/someNewPath').replace();
3&对比window.location(必须有图有真相是吧,上图)
。。。。我懒得翻译了术语太多。。总之功能很强就对了。
4&什么时候需要用到$location呐?
Any time your application needs to react
to a change in the current URL or if you want to change the current URL in the browser.
(任何时间当你的应用在现在的URL上需要改变和跳转的时候,或者你需要改变现在浏览器中的URL时候-----TnT,英语烂请见谅)
5&还有一个特性一定要介绍(上图)
这个。。。我暂时也不太懂,欢迎看了这篇文章而且懂的人来给我解答啦~(此处应该有掌声~)
6&最后的最后一定是小例子啦~加深一下记忆吧~
& &&Browser in HTML5 Fallback mode (Hashbang mode)
(1)index.html
&div ng-controller=&LocationController&&
&div ng-address-bar&&/div&&br&&br&
$location.protocol() = &span ng-bind=&$location.protocol()&&&/span& &br&
$location.host() = &span ng-bind=&$location.host()&&&/span& &br&
$location.port() = &span ng-bind=&$location.port()&&&/span& &br&
$location.path() = &span ng-bind=&$location.path()&&&/span& &br&
$location.search() = &span ng-bind=&$location.search()&&&/span& &br&
$location.hash() = &span ng-bind=&$location.hash()&&&/span& &br&
&div id=&navigation&&
&a href=&/base/first?a=b&&/base/first?a=b&/a& |
&a href=&/base/sec/ond?flag#hash&&sec/ond?flag#hash&/a& |
&a href=&/other-base/another?search&&external&/a&
&/div&(2)app.js
angular.module('hashbang-mode', ['fake-browser', 'address-bar'])
.constant('initUrl', '/base/index.html#!/path?a=b#h')
.constant('baseHref', '/base/index.html')
.value('$sniffer', { history: false })
.config(function($locationProvider) {
$locationProvider.html5Mode(true).hashPrefix('!');
.controller(&LocationController&, function($scope, $location) {
$scope.$location = {};
angular.forEach(&protocol host port path search hash&.split(& &), function(method){
$scope.$location[method] = function(){
var result = $location[method].call($location);
return angular.isObject(result) ? angular.toJson(result) :
.run(function($rootElement) {
$rootElement.on('click', function(e) {
e.stopPropagation();
(3)FakeBrowser.js
angular.module('fake-browser', [])
.config(function($provide) {
$provide.decorator('$browser', function($delegate, baseHref, initUrl) {
$delegate.onUrlChange = function(fn) {
this.urlChange =
$delegate.url = function() {
return initU
$delegate.defer = function(fn, delay) {
setTimeout(function() { fn(); }, delay || 0);
$delegate.baseHref = function() {
return baseH
(4)addressBar.js
angular.module('address-bar', [])
.directive('ngAddressBar', function($browser, $timeout) {
template: 'Address: &input id=&addressBar& type=&text& style=&width: 400px& &',
link: function(scope, element, attrs){
var input = element.children(&input&),
input.on('keypress keyup keydown', function(event) {
delay = (!delay ? $timeout(fireUrlChange, 250) : null);
event.stopPropagation();
.val($browser.url());
$browser.url = function(url) {
return url ? input.val(url) : input.val();
function fireUrlChange() {
$browser.urlChange(input.val());
(5)protractor.js(测试JS)
it(&should show fake browser info on load&, function(){
expect(addressBar.getAttribute('value')).toBe(url);
expect(element(by.binding('$location.protocol()')).getText()).toBe('http');
expect(element(by.binding('$location.host()')).getText()).toBe('');
expect(element(by.binding('$location.port()')).getText()).toBe('80');
expect(element(by.binding('$location.path()')).getText()).toBe('/path');
expect(element(by.binding('$location.search()')).getText()).toBe('{&a&:&b&}');
expect(element(by.binding('$location.hash()')).getText()).toBe('h');
it(&should change $location accordingly&, function(){
var navigation = element.all(by.css(&#navigation a&));
navigation.get(0).click();
expect(addressBar.getAttribute('value')).toBe(&/base/index.html#!/first?a=b&);
expect(element(by.binding('$location.protocol()')).getText()).toBe('http');
expect(element(by.binding('$location.host()')).getText()).toBe('');
expect(element(by.binding('$location.port()')).getText()).toBe('80');
expect(element(by.binding('$location.path()')).getText()).toBe('/first');
expect(element(by.binding('$location.search()')).getText()).toBe('{&a&:&b&}');
expect(element(by.binding('$location.hash()')).getText()).toBe('');
navigation.get(1).click();
expect(addressBar.getAttribute('value')).toBe(&/base/index.html#!/sec/ond?flag#hash&);
expect(element(by.binding('$location.protocol()')).getText()).toBe('http');
expect(element(by.binding('$location.host()')).getText()).toBe('');
expect(element(by.binding('$location.port()')).getText()).toBe('80');
expect(element(by.binding('$location.path()')).getText()).toBe('/sec/ond');
expect(element(by.binding('$location.search()')).getText()).toBe('{&flag&:true}');
expect(element(by.binding('$location.hash()')).getText()).toBe('hash');
(6)效果图一定要有的咯~
a.点击第一个链接
b.点击第二个链接
c.点击第三个链接
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:11588次
排名:千里之外
原创:21篇
(1)(1)(1)(1)(1)(1)(2)(1)(1)(1)(5)(3)(6)(1)(1)(1)AngularJs 用 location 设置和判断在哪个页面_百度知道AngularJs 用 location 设置和判断在哪个页面_百度知道

我要回帖

更多关于 angularjs刷新页面 的文章

 

随机推荐