Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2013-01-01) 27. 使用 $location 服务

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

它是做什么的?

$location服务用来解析浏览器地址栏中的URL(基于window.location),使得它在我们的程序中可用。当改变了地址栏中的URL,$location中的数据会跟着变,反之亦然。

$location服务:

$locationwindow.location比较

window.location $location service
目的 允许对浏览器当前地址进行读写 相同
API 暴露包含属性的"原始"对象,可直接修改 暴露jQuery风格的getters/setters
与Anguar程序生命周期结合 了解所有内部生命周期,与`$watch`结合, ...
与HTML5 API无缝集成 有 (并且与旧浏览器兼容)
知道程序导入的根文档/上下文 否 - `window.location.path`返回"/docroot/actual/path" 是 - `$location.path()`返回"/actual/path"

什么时候我应该使用$location

任何你需要与当前URL交互的时候。

它不能做什么?

当浏览器URL改变的时候,不会重新导入整个页面。如果你想在改变URL时重载整个页面,可使用底层的API:$window.location.href

API的概览

如果$location初始化时的设置不同,则它的行为也不同。默认的设置对于大多数程序是合适的,你也可以自定义它以使用新的功能。

一旦$location初始化完成,你就可以通过jQuery风格的getter/setter方法与它交互,以取得或改变浏览器当前的URL。

$location服务配置

为了配置$location服务,取得$locationProvider并设置以下参数:

配置示例
$locationProvider.html5Mode(true).hashPrefix('!');

#### Getter/Setter

`$location` service为URL中的只读部分提供了getter方法(abUrl,protocal,host,port),为url,path,search,hash提供了getter/setter方法。

// get the current path
$location.path();

// change the path
$location.path('/newValue')

所有的setter方法都返回同一个`$location`对象以方便链式操作。例如,你可以把多个调用串起来:

$location.path('/newValue').search({key: value});

有一个特别的方法叫`replace`,可以让`$location` service在下次与浏览器同步的时候,不要创建新的历史记录,而是替换掉之前最后一个历史记录。这个功能在你实现跳转的时候很有用,因为你不这么做的话,就会破坏掉后退按钮的功能(因为它会反复触发跳转)。

示例如下:

$location.path('/someNewPath');
$location.replace();
// or you can chain these as: $location.path('/someNewPath').replace();

注意这个方法不会马上更新`window.location`,相反,`$location` service了解scope的生命周期,并把多次对`$location`的改变合并为一个操作,在`$digest`阶段提交给`window.location`。因此只用调用`replace()`一次就可以完成整个替换操作,而不会新境历史记录。当浏览器被更新以后,`replace()`将更新标识,以后的操作将会产生新的历史记录,直到再次调用`replace()`

##### Settters和字符集

你可以向`$location` service传特殊字符,它们会根据[RFC 3986](http://www.ietf.org/rfc/rfc3986.txt)中制定的规则被转码。当你访问以下方法时:
comments powered by Disqus