赞
踩
ui.router详解,对比ngRoute,可以使用父子路由,两者同时变化,也可以使用命名路由
- angular.module('myApp', []).
- config(['$routeProvider', function($routeProvider) {
- $routeProvider
- .when('/', {
- templateUrl: 'views/home.html',
- controller: 'HomeController'
- })
- .when('/login', {
- templateUrl: 'views/login.html',
- controller: 'LoginController'
- })
- .when('/dashboard', {
- templateUrl: 'views/dashboard.html',
- controller: 'DashboardController',
- resolve: {
- user: function(SessionService) {
- return SessionService.getCurrentUser();
- }
- }
- })
- .otherwise({
- redirectTo: '/'
- });
- }]);
controller: 'MyController' controller: function($scope) {}
如果配置对象中设置了 controller 属性,那么这个指定的控制器会与路由所创建的新作用
域关联在一起。如果参数值是字符型,会在模块中所有注册过的控制器中查找对应的内容,然后
与路由关联在一起。如果参数值是函数型,这个函数会作为模板中DOM元素的控制器并与模板
进行关联。
AngularJS会将配置对象中的HTML模板渲染到对应的具有 ng-view 指令的DOM元素中
应用会根据 templateUrl 属性所指定的路径通过XHR读取视图(或者从 $templateCache 中读
取)。如果能够找到并读取这个模板,AngularJS会将模板的内容渲染到具有 ng-view 指令的DOM
元素中。
- resolve: {
- 'data': ['$http', function($http) {
- return $http.get('/api').then(
- function success(resp) { return response.data; },
- function error(reason) { return false; }
- );
- }];
- }
如果设置了 resolve 属性,AngularJS会将列表中的元素都注入到控制器中。如果这些依赖是promise对象,它们在控制器加载以及 $routeChangeSuccess 被触发之前,会被resolve并设置成一
列表对象可以是: 键,键值是会被注入到控制器中的依赖的名字;
在上面的例子中, resolve 会发送一个 $http 请求,并将 data 的值替换为返回结果的值。列
表中的键 data 会被注入到控制器中,所以在控制器中可以使用它。
redirectTo: function(route,path,search)
如果 redirectTo 属性的值是一个字符串,那么路径会被替换成这个值,并根据这个目标路径触发路由变化。
如果 redirectTo 属性的值是一个函数,那么路径会被替换成函数的返回值,并根据这个目标路径触发路由变化。
如果 redirectTo 属性的值是一个函数,AngularJS会在调用它时传入下面三个参数中:
(1) 从当前路径中提取出的路由参数;
(2) 当前路径;
(3) 当前URL中的查询串。
个小窍门对路由嵌套和原地分页等需求非常有用。
现在介绍使用when设置路由 下面的例子中设置了两个路由:一个首页路由和一个收件箱路由,同时首页路由被设置成默
认路由。
- angular.module('MyApp', []).
- config(['$routeProvider', function($routeProvider) {
- $routeProvider
- .when('/', {
- controller: 'HomeController',
- templateUrl: 'views/home.html'
- })
- .when('/inbox/:name', {
- controller: 'InboxController',
- templateUrl: 'views/inbox.html'
- })
- .otherwise({redirectTo: '/'});
- }]);
如上,我们已经用 when 方法设置了两个路由。 otherwise 方法会在没有任何路由匹配时被调
用,我们用它设置了一个默认跳转到'/'路径的路由。当浏览器加载AngularJS应用时,会将URL设置成默认路由所指向的路径。除非我们在浏览器中加载不同的URL,否则默认会使用 / 路由。
- $routeProvider
- .when('/inbox/:name', {
- controller: 'InboxController',
- templateUrl: 'views/inbox.html'
- });
AngularJS会在 $routeParams 中添加一个名为 name 的键,它的值会被设置为加载进来的URL
如果浏览器加载 /inbox/all 这个URL,那么 $routeParams 对象看起来会是下面这样:
{ name: 'all' }
- app.controller('InboxController', function($scope,$routeParams) {
- // 在这里访问$routeParams
- });
的路由。它同样提供了修改路径和处理各种形式导航的能力。
$location 服务没有刷新整个页面的能力。如果需要刷新整个页面,需要使用 $window.
location 对象( window.location 的一个接口)。
$location.hash(); // 返回当前的hash片段
我们可以向这个方法中传入新的查询参数,来修改URL中的查询串部分:
// 用对象设置查询
$location.search({name: 'Ari', username: 'auser'});
// 用字符串设置查询
$location.search('name=Ari&username=auser');
值。如果 paramValue 的值是 null ,对应的参数会被移除掉。
新的URL的基础的前缀。
replace (可选,字符串)
想要修改成的路径。
- angular.module('myApp', ['ngRoute'])
- .config(['$locationProvider', function($locationProvider) {
- $locationProvider.html5Mode(false);
- }]);
我们还可以配置 hashPrefix ,也就是标签模式下标签默认的前缀 ! 符号。这个前缀也是
- angular.module('myApp', ['ngRoute'])
- .config(['$locationProvider', function($locationProvider) {
- $locationProvider.html5Mode(false);
- $locationProvider.hashPrefix('!');
- }])
在HTML5模式中,AngularJS会负责重写 <a href=""></a> 中的链接。也就是说AngularJS会
根据浏览器的能力在编译时决定是否要重写 href="" 中的链接。
例如 <a href="/person/42?all=true">Person</a> 这个标签,在老式浏览器中会被重写成
标签模式的URL: /index.html#!/person/42?all=true 。但在现代浏览器中会URL会保持本来
的样子。
后端服务器也需要支持URL重写,服务器需要确保所有请求都返回index.html,以支持HTML5
模式。这样才能确保由AngularJS应用来处理路由。
当在HTML5模式的AngularJS中写链接时,永远都不要使用相对路径。如果你的应用是在根
路径中加载的,这不会有什么问题,但如果是在其他路径中,AngularJS应用就无法正确处理路
由了。
另一个选择是在HTML文档的HEAD中用 <base> 标签来指定应用的基础URL:
<base href="/base/url" />
载路由变化所需要的所有依赖,并且模板和 resolve 键中的promise也会被resolve。
- angular.module('myApp', [])
- .run(['$rootScope', '$location', function($rootScope, $location) {
- $rootScope.$on('$routeChangeStart', function(evt, next, current) {
- });
- }]);
$routeChangeStart 事件带有两个参数:
路由变化前的URL。
AngularJS会在路由的依赖被加载后广播 $routeChangeSuccess 事件。
- angular.module('myApp', [])
- .run(['$rootScope', '$location', function($rootScope, $location) {
- $rootScope.$on('$routeChangeSuccess', function(evt, next, previous) {
- });
- }]);
$routeChangeStart 事件带有三个参数:
原始的AngularJS evt 对象;
用户当前所处的路由;
上一个路由(如果当前是第一个路由,则为 undefined )。
AngularJS会在任何一个promise被拒绝或者失败时广播 $routeChangeError 事件。
- angular.module('myApp', [])
- .run(function($rootScope, $location) {
- $rootScope.$on('$routeChangeError', function(current, previous, rejection) {
- });
- });
当前路由的信息;
被拒绝的promise的错误信息。
会广播 $routeUpdate 事件。
Web爬虫对于JavaScript的胖客户端应用无能为力。为了在应用的运行过程中给爬虫提供支
持,我们需要在头部添加 meta 标签。这个元标记会让爬虫请求一个带有空的转义片段参数的链接,
服务器根据请求返回对应的HTML代码片段。
<meta name="fragment" content="!"/>
$location 服务不会重新加载整个页面,它只会单纯地改变URL。如果我们想重新加载整个
页面,需要用 $window 服务来设置地址。
$window.location.href = "/reload/page";
另外参考:
angular路由详解
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。