路由
一 简介
1.路由机制
为了实现无刷新的视图切换,我们通常会用ajax请求从后台取数据,然后套上HTML模板渲染在页面上,然而ajax的一个致命缺点就是导致浏览器后退按钮失效,尽管我们可以在页面上放一个大大的返回按钮,让用户点击返回来导航,但总是无法避免用户习惯性的点后退。解决此问题的一个方法是使用 hash,监听hashchange事件来进行视图切换,另一个方法是用HTML5的history API,通过pushState()记录操作历史,监听popstate事件来进行视图切换,也有人把这叫pjax技术。
2.angularJS中路由机制的原理
ng的路由机制是靠ngRoute提供的,通过hash和history两种方式实现了路由,可以检测浏览器是否支持history来灵活调用相应的方式。ng的路由(ngRoute)是一个单独的模块,包含以下内容:
服务$routeProvider用来定义一个路由表,即地址栏与视图模板的映射
服务$routeParams保存了地址栏中的参数,例如{id : 1, name : 'tom'}
服务$route完成路由匹配,并且提供路由相关的属性访问及事件,如访问当前路由对应的controller
指令ngView用来在主视图中指定加载子视图的区域
以上内容再加上$location服务,我们就可以实现一个单页面应用了。
二 使用
1.引入文件和依赖
<script src="http://code.angularjs.org/1.2.5/angular.min.js"></script>
<script src="http://code.angularjs.org/1.2.5/angular-route.min.js"></script>
var app = angular.module('MyApp', ['ngRoute']);
2.路由功能是由 routeProvider服务 和 ng-view 搭配实现,ng-view相当于提供了页面模板的挂载点,当切换URL进行跳转时,不同的页面模板会放在ng-view所在的位置; 然后通过 routeProvider 配置路由的映射。
3.一般主要通过两个方法:
when():配置路径和参数;
otherwise:配置其他的路径跳转,可以想成default。
4.when()方法

when(path,route),第一个参数是路由路径,这个路径与$location.path进行匹配。可以在URL中存储参数,参数以冒号开头,如/show/:name,如果地址栏是/show/tom,那么参 数name和所对应的值tom便会被保存在$routeParams中,像这样:{name : tom}。我们也可以用*进行模糊匹配,如:/show*/:name将匹配/showInfo/tom。
第二个参数是配置对象,决定了当地一个参数中的路由能够匹配时具体做些什么,可以设置的属性包括controller,template,templateUrl,resolve,redirectTo,reloadOnSearch

(1)controller:对应路径的控制器函数,或者名称,如controller:'MyController'或controller:function($scope){}
(2)controllerAs:给控制器起个别名
(3)template:对应路径的页面模板,会出现在ng-view处,比如"<div>xxxx</div>"
(4)templateUrl:对应模板的路径,比如"src/xxx.html"
(5)resolve:这个参数着重说下,该属性会以键值对对象的形式,给路由相关的控制器绑定服务或者值。然后把执行的结果值或者对应的服务引用,注入到控制器中。如果resolve中是一个promise对象,那么会等它执行成功后,才注入到控制器中,此时控制器会等待resolve中的执行结果。

使用resolve属性必须配置控制器,否则会报错,angularjs会将属性的键注入到配置的控制器中
mainApp.config(["$routeProvider",function($routeProvider){
$routeProvider.when("/",{
template:"<h1>内容部分{{name}}</h1>",
controller:"MainController",
resolve:{
name:function(){
return "张三";
}
}
});
}]);
表对象可以是:
键:是注入到控制器中的名称
工厂:可以是一个服务工厂,也可以是一个返回值
在控制器中是这样获取上面注入的键:
mainApp.controller("MainController",["name","$scope",function(name,$scope){
$scope.name=name;
}]);

(6)redirectTo:重定向地址

redirectTo:'/home'或redirectTo:function(route,path,search)
如果属性值是一个函数,那么路径就会被替换成函数的返回值,并根据目标路径出发路由变化。三个值分别为:从当前路径中提取出的路径参数,当前路径,当前URL中的查询串

(7)reloadOnSearch:设置是否在只有地址改变时,才加载对应的模板;search和params改变都不会加载模板。若为true(默认),当$location.search()发生变化时会重新加载路由。若为false,当URL中的查询串部分发生变化时不会重新加载路由。这个对路由嵌套和原地分页等需求非常有用。
(8)caseInsensitiveMatch:路径区分大小写
5.路由有几个常用的事件:
$routeChangeStart:这个事件会在路由跳转前触发
$routeChangeSuccess:这个事件在路由跳转成功后触发
$routeChangeError:这个事件在路由跳转失败后触发
三 举例
HTML部分:
<div ng-controller="myCtrl">
        <ul>
            <li><a href="#/a">click a</a></li>
            <li><a href="#/b">click b</a></li>
        </ul>
 
        <ng-view></ng-view>
        <!-- <div ng-view ></div> -->
 </div>
JS部分:
<script type="text/javascript">
    angular.module("myApp",["ngRoute"])
    .controller("aController",function($scope,$route){
        $scope.hello = "hello,a!";
    })
    .controller("bController",function($scope){
        $scope.hello = "hello,b!";
    })
    .controller("myCtrl",function($scope,$location){
 
        $scope.$on("$viewContentLoaded",function(){
            console.log("ng-view content loaded!");
        });
 
        $scope.$on("$routeChangeStart",function(event,next,current){
            //event.preventDefault(); //cancel url change
            console.log("route change start!");
        });
    })
    .config(function($routeProvider, $locationProvider) {
          $routeProvider
           .when('/a', {
            templateUrl: 'a.html',
            controller: 'aController'
          })
        .when('/b', {
            templateUrl: 'b.html',
            controller: 'bController',
            resolve: {
                  // I will cause a 3 second delay
                  delay: function($q, $timeout) {
                    var delay = $q.defer();
                    $timeout(delay.resolve, 3000);
                    return delay.promise;
                  }
            }
        })
        .otherwise({
            redirectTo: '/a'
          });
    });
    </script>
再增加两个HTML页面:
a.html
<div ng-controller="aController" style="height:500px;width:100%;">{{hello}}</div>
b.html
<div ng-controller="bController" style="height:2500px;width:100%;">{{hello}}</div>
其中,/b路径中的resolve关联来一个延迟方法,这个方法返回的时Promise对象,而且3秒钟后才会返回结果。因此b页面,在3秒后才会加载成功。

再如:一个复杂的路由方案会包含多个路由,以及一个可以将所有意外路径进行重定向的捕获器
angular.module('myapp',[])
.config(['$routeProvider',function($routeProvider){
$routeProvider
.when('/',{
templateUrl:'views/home.html',
controller:'HomeController'
})
.when('/dashboard',{
templateUrl:'views/dashboard.html',
controller:'DashboardController',
resolve:{
user:function(SessionService){
return SessionService.getCurrentUser();
}
}
})
.otherwise({
redirectTo:'/'
})
}]);

angularJS 服务三的更多相关文章

  1. 前端MVC学习总结(三)——AngularJS服务、路由、内置API、jQueryLite

    一.服务 AngularJS功能最基本的组件之一是服务(Service).服务为你的应用提供基于任务的功能.服务可以被视为重复使用的执行一个或多个相关任务的代码块. AngularJS服务是单例对象, ...

  2. 前端MVC学习笔记(三)——AngularJS服务、路由、内置API、jQueryLite

    一.服务 AngularJS功能最基本的组件之一是服务(Service).服务为你的应用提供基于任务的功能.服务可以被视为重复使用的执行一个或多个相关任务的代码块. AngularJS服务是单例对象, ...

  3. 聊一聊 AngularJS 服务

    什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. AngularJS 内建了30 多个服务. 为什么使用服务? 在很多服务中,比如 $loca ...

  4. AngularJS进阶(三十九)基于项目实战解析ng启动加载过程

    基于项目实战解析ng启动加载过程 前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理.回过头来总结一下angular的启动过程. 下面以实际项目为例进行简要讲解. 1.载入ng库 2 ...

  5. AngularJS学习之旅—AngularJS 服务(八)

    1.AngularJS 服务(Service) AngularJS 中你可以创建自己的服务,或使用内建服务.2.什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 Angular ...

  6. AngularJS 1.x系列:AngularJS服务-Service、Factory、Provider、Value及Constant(5)

    1. AngularJS服务 AngularJS可注入类型包括:Service.Factory.Provider.Value及Constant. 2. Service AngularJS Servic ...

  7. Springboot & Mybatis 构建restful 服务三

    Springboot & Mybatis 构建restful 服务三 1 前置条件 成功执行完Springboot & Mybatis 构建restful 服务二 2 restful ...

  8. 现在就开始使用AngularJS的三个重要原因

    现在就开始使用AngularJS的三个重要原因 在线演示1 本地下载 如果你不熟悉什么是Angular.js的话,小编我强烈推荐你阅读 Javascript教程:AngularJS的五个超酷特性.简单 ...

  9. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 三

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

随机推荐

  1. javaScript 删除数组中指定元素

    Array.prototype.indexOf = function(val) { for (var i = 0; i < this.length; i++) { if (this[i] == ...

  2. Linux中的find指令

    find find是最常见和最强大的查找命令,在磁盘中查找文件,用它找到任何你想找的文件,就是速度有点慢. find    path    -option    [    -print ]    [ ...

  3. .NET Framework(二)

    在上一篇的随笔中,我们在理论层面上大致说明了.NET Framework的工作机制,内容的确比较晦涩难懂,但是还是希望大家有时候可以看看.我个人觉得,编程不是一味的敲代码,当自己遇到瓶颈的时候,可以多 ...

  4. STM32学习笔记——定时器中断(向原子哥学习)

    定时器中断 STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器.在本章中,我们将利 ...

  5. ObjectiveC1基础代码——类和对象

    // //  main.m //  ObjectiveC1 // //  Created by scjy on 15/10/30. //  Copyright © 2015年 lizhipeng. A ...

  6. 测试gcc的优化选项

    一.测试准备及原理 测试代码: static void wait(volatile unsigned long dly) { ; dly--); } int main(void) { unsigned ...

  7. Scut DirCenter 网站编辑、搭建与调试

    直接利用 Scut 提供的服务器管理工具进行服务器管理. 教程:https://github.com/ScutGame/Scut/wiki/DirServer. 几个注意点: 下载的数据库导入bat是 ...

  8. O-C浮点数转化整数

    1.简单粗暴,直接转化 float f = 1.5; int a; a = (int)f; NSLog("a = %d",a); 输出结果是1.(int)是强制类型转化,丢弃浮点数 ...

  9. House of hello恶搞凯莉迷你包

    欧洲站 House of hello恶搞凯莉迷你包 最近淘宝卖的很疯,看看价格,俺咂舌不已 :1300-1600 今年迷你包卖的很疯我是知道的,迷你包今年没有买一个也是不行的! 剔除暴利,便宜的亲们不 ...

  10. How to use System.Diagnostics.Process correctly

    I’ve seen many a question on stackoverflow and other places about running a process and capturing it ...