ng-$location

转自:http://www.cnblogs.com/liulangmao/p/4138052.html


本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法.

$location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录.

 

一. 获取url的相关方法:

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

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

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

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

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

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

$location.path()
// /foo

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

$location.protocol()
// http

5. 获取当前url的主机名

$location.host()
// localhost

6. 获取当前url的端口

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

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

$location.hash()
// myhash

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

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

 

二. 修改url的相关方法:

在上面讲到的所有获取url的8个方法,其中*开头的四个方法,可以传入参数进行修改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

 

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

参数格式:字符串

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

 

3. 修改url的哈希值部分

参数格式:字符串

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

 

4. 修改url的参数部分

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

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

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

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

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

第一个参数表示url参数的属性名,第二个参数是该属性名的值,有多少个值,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#myhash3

 

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

第一个值表示url参数的属性名,如果是已有属性名,则删除该属性,如果不是已有属性,那就等于没改过

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

 

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

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

①普通的键值对:

$location.search({name:'papamibunny',age:16,love:'zxg'})
// http://localhost/$location/21.1%20$location.html#/foo2/foo3/?name=papamibunny&age=16&love=zxg#myhash3

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

$location.search({name:['code_bunny','white_bunny','hua_bunny'],age:16,love:'zxg'})
// http://localhost/$location/21.1%20$location.html#/foo2/foo3/?name=code_bunny&name=white_bunny&name=hua_bunny&age=16&love=zxg#myhash3

 

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

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

$location.search('bunnybaobao')
// http://localhost/$location/21.1%20$location.html#/foo2/foo3/?bunnybaobao#myhash3
// {"bunnybaobao":true}

 

三. 不存入历史记录:

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

$location.replace()

举个栗子:

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

 

四.$locationChangeStart和$locationChangeStart事件

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

    $rootScope.$on('$locationChangeStart',function(){
        console.log('开始改变$location')
    });
    $rootScope.$on('$locationChangeSuccess',function(){
        console.log('结束改变$location')
    });

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

 

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

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

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

html:

复制代码
<!DOCTYPE html>
<html ng-app="locationApp">
<head>
  <title>21.1 $location</title>
  <meta charset="utf-8">
  <script src="angular.min.js"></script>
  <script src="script.js"></script>
</head>
<body ng-controller="locationCtrl">
  <p>完整url路径: <span>{{absurl}}</span></p>

  <p>url路径(当前url#后面的内容,包括参数和哈希值): <span>{{url}}</span>
    <button ng-click="changeUrl()">改变</button>
  </p>

  <p>相对路径(也就是当前url#后面的内容,不包括参数): <span>{{path}}</span>
    <button ng-click="changePath()">改变</button>
  </p>

  <p>协议(比如http,https): <span>{{protocol}}</span></p>

  <p>主机名: <span>{{host}}</span></p>

  <p>端口号: <span>{{port}}</span></p>

  <p>哈希值: <span>{{hash}}</span>
    <button ng-click="changeHash()">改变</button>
  </p>

  <p>search值序列化json:
    <span>{{search}}</span>
    <button ng-click="changeSearch_1()">改变1</button>
    <button ng-click="changeSearch_2()">改变2</button>
    <button ng-click="changeSearch_3()">改变3</button>
    <button ng-click="changeSearch_4()">改变4</button>
    <button ng-click="changeSearch_5()">改变5</button>
    <button ng-click="changeSearch_6()">改变6</button>
  </p>
</body>
</html>
复制代码

js:

复制代码
/*21.1 $location*/
var locationApp = angular.module('locationApp',[]);
locationApp.controller('locationCtrl',function($scope,$location,$timeout,$rootScope){
    $scope.absurl = $location.absUrl();
    $scope.url = $location.url();
    $scope.path = $location.path();
    $scope.protocol = $location.protocol();
    $scope.host = $location.host();
    $scope.port = $location.port();
    $scope.hash = $location.hash();
    $scope.search = $location.search();

    $scope.refresh = function(){
        $scope.absurl = $location.absUrl();
        $scope.url = $location.url();
        $scope.path = $location.path();
        $scope.hash = $location.hash();
        $scope.search = $location.search();
    };

    //重写url部分,相应的absurl,url,path,hash,search都会改变
    $scope.changeUrl = function(){
        $location.url('/foo2?name=bunny2&age=12#myhash2');
    };

    //重写path部分,相应的absurl,url,path都会改变
    $scope.changePath = function(){
        $location.path('/foo2/foo3');
    };

    //重写hash部分,相应的absurl,url,hash都会改变
    $scope.changeHash = function(){
        $location.hash('myhash3');
    };

    //修改search部分(方法1),相应的absurl,url,search,hash都会改变
    //指定两个参数,第一个参数是属性名,第二个参数是属性值.
    //如果属性名是已有属性,则修改,如果属性名不是已有的,则新增.
    //属性值也可以是一个数组,参考方法6
    $scope.changeSearch_1 = function(){
        $location.search('name','code_bunny');
    };

    //修改search部分(方法2),相应的absurl,url,search,hash都会改变
    //指定两个参数,第二个参数是null:删除第一个参数所指定的属性名.不再有这个属性
    //若第一个参数不是已有的,则不发生任何改变
    $scope.changeSearch_2 = function(){
        $location.search('age',null);
    };

    //修改search部分(方法3),相应的absurl,url,search,hash都会改变
    //指定一个参数,json对象,直接重写整个search部分.不管是不是已有属性,全部重写.
    //这里属性的值可以是一个数组,参考方法5
    $scope.changeSearch_3 = function(){
        $location.search({name:'papamibunny',age:16,love:'zxg'});
    };

    //修改search部分(方法4),相应的absurl,url,search,hash都会改变
    //指定一个参数,字符串,整个search部分就变为这个字符串.注意是没有属性值的.
    $scope.changeSearch_4 = function(){
        $location.search('bunnybaobao');
    };

    //修改search部分(方法5),相应的absurl,url,search,hash都会改变
    //其余和方法3一样.全部重写search:
    //指定一个参数,json格式,属性值是一个数组,那么最后的search会变成name=code_bunny&name=white_bunny&name=hua_bunny
    $scope.changeSearch_5 = function(){
        $location.search({name:['code_bunny','white_bunny','hua_bunny']});
    };

    //修改search部分(方法6),相应的absurl,url,search,hash都会改变
    //其余和方法1一样,修改指定的属性名(或新增)
    //第二个参数是一个数组,最后search中的love部分会变成love=zxg&love=mitu
    //它和方法5的区别,就像方法1和方法3的区别,一个是修改或新增某个属性值,一个是重置整个search
    $scope.changeSearch_6 = function(){
        $location.search('love',['zxg','mitu']).replace();
    };

    //使用$location.replace(),则这一次的修改路径不会被记录到历史记录中,点击后退,不会后退到改变前的路径,而是后退到改变前的路径的改变前的路径

    $rootScope.$on('$locationChangeStart',function(){
        console.log('开始改变$location')
    });
    $rootScope.$on('$locationChangeSuccess',function(){
     $scope.refresh(); console.log(
'结束改变$location') }); //这里就算绑定了$routeChangeStart和$routeChangeSuccess,也不会被触发,因为这里没有$route相关的服务. }); //注意这里$scope下的这些值是不会实时更新的.举栗url,$location.url()是个方法,获取当前的url,而不是一个值, //所以,当url发生改变以后,不再次调用$location.url(),url值是不可能被实时更新的.
复制代码

整个过程如下:

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

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

图1.1

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

图1.2

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

图1.3

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

图1.4

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

图1.5

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

图1.6

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

图1.7

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

图1.8

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

图1.9

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

图1.10

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



hashbang模式和history api创建单页应用

首先,$location是用在单页应用里的...(废话,angular就是用在单页的)...所以,$location处理的是url改变,但是不刷新页面的情况.那么我们知道,不刷新页面但是请求ajax改变url,需要存入历史记录.这样的话,需要使用html5的history api,但是对于不支持history api的浏览器(也就是ie8,9吧,反正ie7angular本来就不支持,而且看了花瓣网,它在ie7,8,也没有使用单页,而是新开链接),则需要使用hashbang模式.

什么叫hashbang模式?在网上查阅了很多也没有查到具体的说明.只能按照自己理解的来总结:

比如一个url: http://localhost:801/$location/index.html,这个页面,在垃圾浏览器里,需要实现发送ajax,改变url,但是不刷新页面,并且可以使用后退前进按钮,怎么做呢? 就在url后面使用'#'加一个标识符'!',再加上路径,参数,哈希值等...这样,因为使用了'#',所以页面不会刷新,而url也改变了,可以存入历史记录.其中'#'代表了hash,'!'代表了bang,所以这种模式被称为hashbang模式.注意,'!'不是固定的,可以是任意的标识符,也可以为空的.而且,当我刷新http://localhost:801/$location/index.html#!/foo?name=code_bunny#bunny时,可以访问到http://localhost:801/$location/index.html.

这就是我自己总结的传统的hashbang模式.而使用HTML5 history api,则不需要'#'和标示符.只需要直接在url后面加上路径,参数,哈希值,等...但是当我刷新http://localhost:801/$location/index.html/foo?name=code_bunny#bunny时,是不能访问到http://localhost:801/$location/index.html页面的,需要服务端进行配置,使应用能够接受来自http://localhost:801/$location/index.html/foo?name=code_bunny#bunny的请求.

介绍完了hashbang和history api,接下来来看下angular是怎么处理它们的.

 

配置$location服务

可以看到,在 angular学习笔记(三十一)-$location(1)这篇文章里,所有例子的url都是带有#的,(bang标识符为空),无论在任何浏览器里,它都是这样的,而没有使用history api. 如果需要使用history api,或者配置bang标识符,可以对$location服务进行配置:

var locationApp = angular.module('locationApp',[]);
locationApp.config(function($locationProvider){
    $locationProvider.html5Mode(true).hashPrefix('!');
});

$locationProvider有两个方法可以配置:

$locationProvider.html5Mode(boolean || obj)

1.$locationProvider.html5Mode(true): 开启html5的history api

2.$locationProvider.html5Mode(false): 关闭html5的history api

3.$locationProvider.html5Mode({enabled:true}): 同1

4.$locationProvider.html5Mode({enabled:false}): 同2(默认配置)

5.$locationProvider.html5Mode({requireBase:true}): 设置为'需要定义base href'标签(后面会讲到base href标签)

6.$locationProvider.html5Mode({requireBase:false}): 设置为'不需要定义base href'标签(后面会讲到base href标签)

$locationProvider.hashPrefix('string')

设置bang标识符.不设置的话,默认为空

 

base href属性的定义 

在介绍hashbang和histroy api的时候,我把url分成了两部分颜色显示,第一部分是浅绿色的,第二部分是深绿色的.浅绿色的是固定不变的,而深绿色的,是可以改变的.也就是$location.url()

那么浏览器是如何知道固定的是什么的呢? 就是通过设置base href属性:

在head标签里添加如下标签:

<base href="/$location/base/">

这样,浏览器就知道,不变的部分是 http://localhost:801/$location/base/.注意,一定要有'/'开头,'/'结尾,否则在垃圾浏览器里会有问题.因为它不会自己给它加上'/',但如果你定义的base href是'/$location/base/index.html',那是可以的.

另外,定义了这个base href以后,页面里所有的js,css,都是这个base href的相对路径.

前面提到了$locationProvider.html5Mode的参数的requireBase属性,就是用来定义是否页面中一定要定义base href标签的.

如果不定义,它会自己把页面的根目录作为固定部分,比如 http://localhost:801/$location/base/index.html, 它会认为固定部分是http://localhost:801

总结一下,base href的值,应该是域名部分后面的整个路径部分,以/开始,/结尾,注意一定要加这个属性!!!实际工作中很容易忘记加它导致路由不生效也不报错.被坑过很多次了!!!

 

a链接的跳转

页面的url改变,肯定是点击了某些元素,最常见的自然是a链接,a链接本来的作用是跳转页面,但在单页应用中,我们只需要让它改变url后面的$location.url()部分,而不刷新页面.所以,a链接可以这么写:

<a href="some1?foo=bar">/some1?foo=bar</a> 
<a href="some2?foo=bar#myhash">/some2?foo=bar#myhash</a> 

angular会自动处理浏览器的兼容问题.假设点击第一个链接:

在高级浏览器里,url会变成: http://localhost:801/$location/base/some1?foo=bar

在垃圾浏览器里,url会变成: http://localhost:801/$location/base/#!/some1?foo=bar

注意事项:

1.href值以'/'开头,会跳转刷新页面.

2.a链接带有target属性,会跳转刷新页面.

3.外链的话,直接写绝对地址即可跳转刷新页面

 

$location的双向数据绑定 

下面这段代码演示了如何实现让$location.url和地址栏的url双向绑定:

<input type="text" ng-model="location" ng-model-options="{getterSetter:true}"/>
$scope.location=function(newLocation){
    return $location.url(newLocation);
};

 

综合实例

最后,我用所有关于$location的知识写一个demo:

这个实例在angular学习笔记(三十一)-$location(1)的基础上新增了本篇讲到的知识:

1.添加base href标签

2.hashbang和html5 history api处理浏览器兼容

3.$location双向数据绑定

4.a链接改变url

 

html:

复制代码
<!DOCTYPE html>
<html ng-app="locationApp">
<head>
  <title>21.1 $location</title>
  <meta charset="utf-8">
  <base href="/$location/base/">
  <script src="../angular-1.3.2.js"></script>
  <script src="../script.js"></script>
</head>

<body ng-controller="locationCtrl">
<input type="text" ng-model="location" ng-model-options="{getterSetter:true}"/> <p>完整url路径: <span>{{absurl}}</span></p> <p>url路径(当前url#后面的内容,包括参数和哈希值): <span>{{url}}</span> <button ng-click="changeUrl()">改变</button> </p> <p>相对路径(也就是当前url#后面的内容,不包括参数): <span>{{path}}</span> <button ng-click="changePath()">改变</button> </p> <p>协议(比如http,https): <span>{{protocol}}</span></p> <p>主机名: <span>{{host}}</span></p> <p>端口号: <span>{{port}}</span></p> <p>哈希值: <span>{{hash}}</span> <button ng-click="changeHash()">改变</button> </p> <p>search值序列化json: <span>{{search}}</span> <button ng-click="changeSearch_1()">改变1</button> <button ng-click="changeSearch_2()">改变2</button> <button ng-click="changeSearch_3()">改变3</button> <button ng-click="changeSearch_4()">改变4</button> <button ng-click="changeSearch_5()">改变5</button> <button ng-click="changeSearch_6()">改变6</button> </p> <a href="some1?foo=bar">/some1?foo=bar</a> | <a href="some2?foo=bar#myhash">/some2?foo=bar#myhash</a> | <a href="http://www.baidu.com">外部链接</a>

</body> </html>
复制代码

js:

复制代码
var locationApp = angular.module('locationApp',[]);
locationApp.config(function($locationProvider){
    $locationProvider.html5Mode(true).hashPrefix('!');
});
locationApp.controller('locationCtrl',function($scope,$location,$timeout,$rootScope){
    $scope.location=function(newLocation){
        return $location.url(newLocation);
    };
    $scope.absurl = $location.absUrl();
    $scope.url = $location.url();
    $scope.path = $location.path();
    $scope.protocol = $location.protocol();
    $scope.host = $location.host();
    $scope.port = $location.port();
    $scope.hash = $location.hash();
    $scope.search = $location.search();

    $scope.refresh = function(){
        $scope.absurl = $location.absUrl();
        $scope.url = $location.url();
        $scope.path = $location.path();
        $scope.hash = $location.hash();
        $scope.search = $location.search();
    };

    //重写url部分,相应的absurl,url,path,hash,search都会改变
    $scope.changeUrl = function(){
        $location.url('/foo2?name=bunny2&age=12#myhash2');
    };

    //重写path部分,相应的absurl,url,path都会改变
    $scope.changePath = function(){
        $location.path('/foo2/foo3');
    };

    //重写hash部分,相应的absurl,url,hash都会改变
    $scope.changeHash = function(){
        $location.hash('myhash3');
    };

    //修改search部分(方法1),相应的absurl,url,search,hash都会改变
    //指定两个参数,第一个参数是属性名,第二个参数是属性值.
    //如果属性名是已有属性,则修改,如果属性名不是已有的,则新增.
    //属性值也可以是一个数组,参考方法6
    $scope.changeSearch_1 = function(){
        $location.search('name','code_bunny');
    };

    //修改search部分(方法2),相应的absurl,url,search,hash都会改变
    //指定两个参数,第二个参数是null:删除第一个参数所指定的属性名.不再有这个属性
    //若第一个参数不是已有的,则不发生任何改变
    $scope.changeSearch_2 = function(){
        $location.search('age',null);
    };

    //修改search部分(方法3),相应的absurl,url,search,hash都会改变
    //指定一个参数,json对象,直接重写整个search部分.不管是不是已有属性,全部重写.
    //这里属性的值可以是一个数组,参考方法5
    $scope.changeSearch_3 = function(){
        $location.search({name:'papamibunny',age:16,love:'zxg'});
    };

    //修改search部分(方法4),相应的absurl,url,search,hash都会改变
    //指定一个参数,字符串,整个search部分就变为这个字符串.注意是没有属性值的.
    $scope.changeSearch_4 = function(){
        $location.search('bunnybaobao');
    };

    //修改search部分(方法5),相应的absurl,url,search,hash都会改变
    //其余和方法3一样.全部重写search:
    //指定一个参数,json格式,属性值是一个数组,那么最后的search会变成name=code_bunny&name=white_bunny&name=hua_bunny
    $scope.changeSearch_5 = function(){
        $location.search({name:['code_bunny','white_bunny','hua_bunny']});
    };

    //修改search部分(方法6),相应的absurl,url,search,hash都会改变
    //其余和方法1一样,修改指定的属性名(或新增)
    //第二个参数是一个数组,最后search中的love部分会变成love=zxg&love=mitu
    //它和方法5的区别,就像方法1和方法3的区别,一个是修改或新增某个属性值,一个是重置整个search
    $scope.changeSearch_6 = function(){
        $location.search('love',['zxg','mitu']).replace();
    };

    //使用$location.replace(),则这一次的修改路径不会被记录到历史记录中,点击后退,不会后退到改变前的路径,而是后退到改变前的路径的改变前的路径

    $rootScope.$on('$locationChangeStart',function(){
        console.log('开始改变$location')
    });
    $rootScope.$on('$locationChangeSuccess',function(){
        $scope.refresh();
        console.log('结束改变$location')
    });
    //这里就算绑定了$routeChangeStart和$routeChangeSuccess,也不会被触发,因为这里没有$route相关的服务.
});
复制代码

*以上demo运行在我本地的http://localhost:801/这个wamp服务下.

 

1.添加base href标签

添加了base href标签后,页面的基础url就变为: http://localhost:801/$location/base/

2.hashbang和html5 history api处理浏览器兼容

设置启用html5的history api,设置bang标识符为'!'

完成了1,2以后,在浏览器里打开 http://localhost:801/$location/base

在高级浏览器里: 

在ie9模式:

这里初始状态的$location.url,一个有'/',一个没有'/',不过这个不用介意.不影响实际的使用的.

需要重视的是,当链接发生过改变(比如我点击了链接1/some1?foo=bar),然后刷新页面,在ie9下,它依然可以加载到该页面,但是在chrome下是不行的,所以,在使用了history api的浏览器里,需要服务端配置.通常,你要把所有链接都转给应用的入口点(比如index.html)。

3.$location双向数据绑定

可以使用1.3提供的ng-model-options的getterSetter,给input绑定location方法.这样,input输入内容,就会调用$location.url(newLocation)设置url,当调用$location.url('...')的时候,input元素的value值也会被同步.需要注意,直接在地址栏输入url是没用的,不过这无所谓,因为应用中也不会有人要跳转的时候手动输地址...

4.a链接改变url

点击前面两个链接,url会改变,不刷新页面. 

 

完整代码:https://github.com/OOP-Code-Bunny/angular/tree/master/%24location 

参考文献:http://www.ngnice.com/docs/guide/$location (中文版的是1.2的,不是最新的) https://docs.angularjs.org/guide/$location



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值