angularjs $location

前端之家收集整理的这篇文章主要介绍了angularjs $location前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一. 获取url的相关方法:@H_404_2@

'http://localhost/$location/21.1%20$location.html#/foo?name=bunny#myhash'@H_404_2@这个路径为例:

1.获取当前完整的url路径:

$location.absUrl():
// http://localhost/$location/21.1%20$location.html#/foo?name=bunny#myhash@H_404_2@

*@H_404_2@2. 获取当前url路径(当前url#后面的内容,包括参数和哈希值):

$location.url();
// /foo?name=bunny#myhash@H_404_2@

*@H_404_2@3. 获取当前url的子路径(也就是当前url#后面的内容,不包括参数):

$location.path()
// /foo@H_404_2@

4. 获取当前url的协议(比如http,https)

$location.protocol()
// http@H_404_2@

5. 获取当前url的主机名

$location.host()
// localhost@H_404_2@@H_404_2@

6. 获取当前url的端口

$location.port()
// 80 (这里就是wamp的默认端口号)@H_404_2@

*@H_404_2@7. 获取当前url的哈希值

$location.hash()
// myhash@H_404_2@

*@H_404_2@8. 获取当前url的参数的序列化json对象

$location.search()
// {"name":"bunny"}@H_404_2@@H_404_2@

二. 修改url的相关方法:@H_404_2@

在上面讲到的所有获取url的8个方法,其中*@H_404_2@开头的四个方法,可以传入参数进行修改url,在这种情况下,函数的返回值都是$location本身:

1.修改url的子路径(也就是当前url#后面的内容,不包括参数):

参数格式:字符串

$location.url('/foo2?name=bunny2&age=12#myhash2');
// http://localhost/$location/21.1%20$location.html#/foo2?name=bunny2&age=12#myhash2@H_404_2@@H_404_2@

2. 修改url的子路径部分(也就是当前url#后面的内容,245)">$location.path('/foo2/foo3');
/foo2/foo3@H_404_2@/?name=bunny2&age=12#myhash2@H_404_2@

3. 修改url的哈希值部分

$location.hash('myhash3');
// http://localhost/$location/21.1%20$location.html#/foo2/foo3/?name=bunny2&age=12#myhash3@H_404_2@@H_404_2@

4. 修改url的参数部分

(1).传入两个参数,第一个参数的格式为字符串:

①第二个参数的格式也是字符串

第一个参数表示url参数的属性名,第二个参数是该属性名的属性值,如果是已有属性名,则修改,如果不是已有属性,则新增

$location.search('name','code_bunny')
// http://localhost/$location/21.1%20$location.html#/foo2/foo3/?name=code_bunny@H_404_2@2&age=12#myhash3@H_404_2@

②第二个参数的格式为数组,数组中的各个值也是字符串或者布尔值

属性名的值,有多少个值,url中就会依次重复出现多少个.如下:

$location.search('love',['zxg','mitu'])
// http://localhost/$location/21.1%20$location.html#/foo2/foo3/?name=code_bunny2&age=12&love=zxg&love=mitu@H_404_2@#myhash3@H_404_2@

(2).传入两个参数,第一个参数为字符串,第二个参数为null:

第一个值表示url参数的属性名,则删除属性,那就等于没改过

$location.search('age',null@H_404_2@)
// http://localhost/$location/21.1%20$location.html#/foo2/foo3/?name=code_bunny2#myhash3@H_404_2@

(3).传入一个参数,格式为json对象:

直接用这个json对象里的键值对替换整个url的参数部分

①普通的键值对:

$location.search({name:'papamibunny',age:16,love:'zxg'})
name=papamibunny&age=16&love=zxg@H_404_2@#myhash3@H_404_2@

属性值为一个数组:(和(1)②一样,重复这个属性)

$location.search({name:['code_bunny','white_bunny','hua_bunny'],255)">name=code_bunny&name=white_bunny&name=hua_bunny&age=16&love=zxg@H_404_2@#myhash3@H_404_2@

(4).传入一个参数,格式为字符串:

直接用这个字符串替换整个url的参数部分(没有键值对,参数部分就是一个属性名,但转换成json对象的话,这个属性的值就是true,但是在url里没有体现)

$location.search('bunnybaobao')
bunnybaobao@H_404_2@#myhash3
// {"bunnybaobao":true}@H_404_2@

三. 不存入历史记录:@H_404_2@

在使用 '二' 里面的所有修改url的方法的时候,每修改一次,url都会被存入历史记录,可以使用后退按钮回到修改前的url,如果不想要这种效果,而仅仅是替换当前的记录,可以使用:@H_404_2@

$location.replace()

举个栗子:

// 原url:@H_404_2@
// http://localhost/$location/21.1%20$location.html#/foo?name=bunny#myhash@H_404_2@
//@H_404_2@ 修改一次后:@H_404_2@
// http://localhost/$location/21.1%20$location.html#/foo2?name=bunny2&age=12#myhash2@H_404_2@
// 按下后退回到原url:@H_404_2@
// http://localhost/$location/21.1%20$location.html#/foo?name=bunny#myhash
// 再按下前进回到修改后url:
@H_404_2@$location.path('/foo2/foo3').replace();
// 修改第二次后调用replace():@H_404_2@
// http://localhost/$location/21.1%20$location.html#/foo2/foo3?name=bunny2&age=12#myhash2@H_404_2@
// 按下后退,不会回到第二次修改前的url,而是回到第一次修改前的url:@H_404_2@
四.$locationChangeStart和$locationChangeStart事件@H_404_2@

这两个事件分别发生在当url开始发生改变,以及url改变完成.他们都被绑定在$rootScope里面:@H_404_2@

$rootScope.$on('$locationChangeStart',255)">function@H_404_2@(){ console.log(@H_404_2@'开始改变$location') }); $rootScope.$on(@H_404_2@'$locationChangeSuccess',0)">(){ console.log(@H_404_2@'结束改变$location') });@H_404_2@

这个和$route里的$routeChangeStart和$routeChangeSuccess很类似,但是要注意的是,虽然都是改变url发生的事件,但要触发$locationChangeStart和$locationChangeSuccess事件,就必须是$location服务导致的url变化,通过$route定义导致的url变化,不会触发$locationChangeStart和$locationChangeSuccess事件,同样,这里是通过$location服务导致的url变化,所以即使定义了$routeChangeStart和$routeChangeSuccess事件,它也是不会被触发的.@H_404_2@

把上面讲到的这些一起举个栗子:@H_404_2@

把 '一' 里面的8个可以取到的url部分都赋值给$scope里的值,同时,把对应的修改方法绑定在对应的按钮上,以便在视图上查看变化过程.@H_404_2@

需要注意的是,这里有个@H_404_2@$scope.refresh方法,因为这里$scope下的这些值是不会实时更新的.举栗,$location.url()是个方法,获取当前的url,而不是一个值,所以,当url发生改变以后,不再次调用$location.url(),url值是不可能被实时更新的.所以refresh方法就是在每次url改变完成后,重新获取url对应的部分并更新视图.

html:

<!@H_404_2@DOCTYPE html@H_404_2@>@H_404_2@ <@H_404_2@html @H_404_2@ng-app@H_404_2@="locationApp"@H_404_2@head@H_404_2@>@H_404_2@ title@H_404_2@>@H_404_2@21.1 $location</@H_404_2@Meta @H_404_2@charset@H_404_2@="utf-8"@H_404_2@script @H_404_2@src@H_404_2@="angular.min.js"@H_404_2@></@H_404_2@script@H_404_2@="script.js"@H_404_2@body @H_404_2@ng-controller@H_404_2@="locationCtrl"@H_404_2@p@H_404_2@>@H_404_2@完整url路径: span@H_404_2@>@H_404_2@{{absurl}}>@H_404_2@ >@H_404_2@url路径(当前url#后面的内容,包括参数和哈希值): >@H_404_2@{{url}}>@H_404_2@ button @H_404_2@ng-click@H_404_2@="changeUrl()"@H_404_2@>@H_404_2@改变button@H_404_2@>@H_404_2@相对路径(也就是当前url#后面的内容,不包括参数): >@H_404_2@{{path}}="changePath()"@H_404_2@>@H_404_2@协议(比如http,https): >@H_404_2@{{protocol}}>@H_404_2@主机名: >@H_404_2@{{host}}>@H_404_2@端口号: >@H_404_2@{{port}}>@H_404_2@哈希值: >@H_404_2@{{hash}}="changeHash()"@H_404_2@>@H_404_2@search值序列化json: @H_404_2@>@H_404_2@{{search}}="changeSearch_1()"@H_404_2@>@H_404_2@改变1="changeSearch_2()"@H_404_2@>@H_404_2@改变2="changeSearch_3()"@H_404_2@>@H_404_2@改变3="changeSearch_4()"@H_404_2@>@H_404_2@改变4="changeSearch_5()"@H_404_2@>@H_404_2@改变5="changeSearch_6()"@H_404_2@>@H_404_2@改变6body@H_404_2@html@H_404_2@>@H_404_2@

js:@H_404_2@

/*@H_404_2@21.1 $location@H_404_2@*/@H_404_2@ var@H_404_2@ locationApp = angular.module('locationApp',[]); locationApp.controller(@H_404_2@'locationCtrl',0)">($scope,$location,$timeout,$rootScope){ $scope.absurl @H_404_2@= $location.absUrl(); $scope.url @H_404_2@= $location.url(); $scope.path @H_404_2@= $location.path(); $scope.protocol @H_404_2@= $location.protocol(); $scope.host @H_404_2@= $location.host(); $scope.port @H_404_2@= $location.port(); $scope.hash @H_404_2@= $location.hash(); $scope.search @H_404_2@= $location.search(); $scope.refresh @H_404_2@= (){ $scope.absurl @H_404_2@= $location.absUrl(); $scope.url @H_404_2@= $location.url(); $scope.path @H_404_2@= $location.path(); $scope.hash @H_404_2@= $location.hash(); $scope.search @H_404_2@= $location.search(); }; @H_404_2@//@H_404_2@重写url部分,相应的absurl,url,path,hash,search都会改变@H_404_2@ $scope.changeUrl = (){ $location.url(@H_404_2@'/foo2?name=bunny2&age=12#myhash2'); }; @H_404_2@重写path部分,path都会改变@H_404_2@ $scope.changePath = (){ $location.path(@H_404_2@'/foo2/foo3'重写hash部分,hash都会改变@H_404_2@ $scope.changeHash = (){ $location.hash(@H_404_2@'myhash3'修改search部分(方法1),search,hash都会改变@H_404_2@ 指定两个参数,第一个参数是属性名,第二个参数是属性值.@H_404_2@ 如果属性名是已有属性,如果属性名不是已有的,则新增.@H_404_2@ 属性值也可以是一个数组,参考方法6@H_404_2@ $scope.changeSearch_1 = (){ $location.search(@H_404_2@'name','code_bunny'修改search部分(方法2),第二个参数是null:删除第一个参数所指定的属性名.不再有这个属性@H_404_2@ 若第一个参数不是已有的,则不发生任何改变@H_404_2@ $scope.changeSearch_2 = (){ $location.search(@H_404_2@'age',255)">null@H_404_2@修改search部分(方法3),0)">指定一个参数,json对象,直接重写整个search部分.不管是不是已有属性,全部重写.@H_404_2@ 这里属性的值可以是一个数组,参考方法5@H_404_2@ $scope.changeSearch_3 = (){ $location.search({name:@H_404_2@'papamibunny',love:'zxg'}); }; @H_404_2@修改search部分(方法4),字符串,整个search部分就变为这个字符串.注意是没有属性值的.@H_404_2@ $scope.changeSearch_4 = (){ $location.search(@H_404_2@'bunnybaobao'修改search部分(方法5),0)">其余和方法3一样.全部重写search:@H_404_2@ 属性值是一个数组,那么最后的search会变成name=code_bunny&name=white_bunny&name=hua_bunny@H_404_2@ $scope.changeSearch_5 = (){ $location.search({name:[@H_404_2@'code_bunny','hua_bunny']}); }; @H_404_2@修改search部分(方法6),0)">其余和方法1一样,修改指定的属性名(或新增)@H_404_2@ 第二个参数是一个数组,最后search中的love部分会变成love=zxg&love=mitu@H_404_2@ 它和方法5的区别,就像方法1和方法3的区别,一个是修改或新增某个属性值,一个是重置整个search@H_404_2@ $scope.changeSearch_6 = (){ $location.search(@H_404_2@'love','mitu']).replace(); }; @H_404_2@使用$location.replace(),则这一次的修改路径不会被记录到历史记录中,点击后退,不会后退到改变前的路径,而是后退到改变前的路径的改变前的路径@H_404_2@ $rootScope.$on(@H_404_2@'$locationChangeStart',0)">(){
     $scope.refresh(); console.log(@H_404_2@'结束改变$location') }); @H_404_2@这里就算绑定了$routeChangeStart和$routeChangeSuccess,也不会被触发,因为这里没有$route相关的服务.@H_404_2@ }); @H_404_2@注意这里$scope下的这些值是不会实时更新的.举栗url,@H_404_2@ //@H_404_2@所以,url值是不可能被实时更新的.@H_404_2@

整个过程如下:

1.初始状态,输入如下url:

http://localhost/$location/21.1%20$location.html#/foo?name=bunny#myhash

图1.1

依次点击'改变'按钮后:

图1.2

----------------------------------------------------------------------------------------------------------------------------

图1.3

----------------------------------------------------------------------------------------------------------------------------@H_404_2@

图1.4

图1.5

图1.6

图1.7

图1.8

图1.9

图1.10

此时点击后退,不会回到图1.9,而是回到图1.8

猜你在找的Angularjs相关文章