AngularJS入门教程之路由机制ngRoute实例分析


Posted in Javascript onDecember 13, 2016

本文实例讲述了AngularJS路由机制ngRoute。分享给大家供大家参考,具体如下:

引言

在我们介绍路由之前我们首先谈一下SPA,所以SPA就是我们现在经常说的单页应用single page APP,为了实现无刷新的视图切换我们之前的做法就是利用AJAX从后取出数据然后渲染在前台页面HTML中,但是AJAX有一个致命的缺点就是不能实现浏览器的后退按钮失效,为了解决这个问题我们通常使用hash,监听hashchange事件来进行视图切换,另一个方法是用HTML5的history API,通过pushState()记录操作历史,监听popstate事件来进行视图切换,也有人把这叫pjax技术。基本流程如下:

AngularJS入门教程之路由机制ngRoute实例分析

如此一来,便形成了通过地址栏进行导航的深度链接(deeplinking ),也就是我们所需要的路由机制。通过路由机制,一个单页应用的各个视图就可以很好的组织起来了。

ng-route包含的内容

ng的路由机制是靠ngRoute提供的,通过hash和history两种方式实现了路由,可以检测浏览器是否支持history来灵活调用相应的方式。ng的路由(ngRoute)是一个单独的模块,包含以下内容:

•服务$routeProvider用来定义一个路由表,即地址栏与视图模板的映射

•服务$routeParams保存了地址栏中的参数,例如{id : 1, name : 'tom'}

•服务$location用来实现用于获取当前url以及改变当前的url,并且存入历史记录

•服务$route完成路由匹配,并且提供路由相关的属性访问及事件,如访问当前路由对应的controller

•指令ngView用来在主视图中指定加载子视图的区域

路由机制的实现

第一步、引入两个依赖文件

<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
<script src="http://cdn.bootcss.com/angular.js/1.2.9/angular-route.min.js"></script>

因为路由机制上一个单独的模块,所以我们需要单独的引入路由文件,仅仅引入AngularJS.min.js是不包含路由的,引入文件以后我们还需要在模块声明中注入对ng-route的依赖:

var app = angular.module("myApp", ['ngRoute']);

完成了这些,我们就可以在模板或是controller中使用上面的服务和指令了。下面我们需要定义一个路由表。

第二步:完成路由表的配置

app.config(['$routeProvider', function ($routeProvider) {
    $routeProvider
      .when('/div1', {
        template: '<p>这是div1{{text}}</p>',
        controller: 'div1Controller'
      })
      .when('/div2', {
        template: '<p>这是div2{{text}}</p>',
          controller: 'div2Controller'
      })
      .when('/div3', {
        template: '<p>这是div3{{text}}</p>',
        controller: 'div3Controller'
      })
      .when('/content/:id', {
        template: '<p>这是content{{id}}</p>',
        controller: 'div4Controller'
      })
      .otherwise({
        redirectTo: '/div1'
      });
}]);

$routeProvider提供了定义路由表的服务,它有两个核心方法,when(path,route)和otherwise(params),先看一下核心中的核心when(path,route)方法。

when(path,route)方法接收两个参数,path是一个string类型,表示该条路由规则所匹配的路径,它将与地址栏的内容($location.path)值进行匹配。如果需要匹配参数,可以在path中使用冒号加名称的方式,如:path为/show/:name,如果地址栏是/show/tom,那么参数name和所对应的值tom便会被保存在$routeParams中,像这样:

{name : tom}。我们也可以用*进行模糊匹配,如:/show*/:name将匹配/showInfo/tom。

参数说明如下:

controller //function或string类型。在当前模板上执行的controller函数,生成新的scope
controllerAs //string类型,为controller指定别名
template //string或function类型,视图所用的模板,这部分内容将被ngView引用
templateUrl //string或function类型,当视图模板为单独的html文件或是使用了<script type="text/ng-template">定义模板时使用
resolve //指定当前controller所依赖的其他模块
redirectTo //重定向的地址

第三步:在主视图模板中指定加载子视图的位置

我们的单页面程序都是局部刷新的,那这个“局部”是哪里呢,这就轮到ngView出马了,只需在模板中简单的使用此指令,在哪里用,哪里就是“局部”。

通过以上我们就完成了了一个路由的全部配置过程,在没有接触路由的时候感觉路由这一块是比价难的,但是当我们真正的了解到这一块的原理的时候并不是非常的难,路由在AngularJS中是核心部分所以我们需要牢牢的掌握这一部分。

友情推荐:

看到这可能会有人说如果有个完整的Ddeo就好了,所以说小编给大家推荐一个编写前台代码的工具RunJS并且可以实现代码的共享,小编的这个Demo就在这上面,可在此处查看效果;http://sandbox.runjs.cn/show/gj894e3t#/content/13

此处查看源码:
http://runjs.cn/code/gj894e3t

这样以后我们就可以随意的分享代码,尤其是我们在讲课的时候非常的方便!

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
JSON扫盲帖 JSON.as类教程
Feb 16 Javascript
面向对象的编程思想在javascript中的运用上部
Nov 20 Javascript
jquery实现页面图片等比例放大缩小功能
Feb 12 Javascript
js事件监听机制(事件捕获)总结
Aug 08 Javascript
jquery设置表单元素为不可用的简单代码
Jul 04 Javascript
微信小程序 设置启动页面的两种方法
Mar 09 Javascript
vue.js利用defineProperty实现数据的双向绑定
Apr 28 Javascript
JavaScript之排序函数_动力节点Java学院整理
Jun 30 Javascript
详解Vue 动态组件与全局事件绑定总结
Nov 11 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
Sep 23 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
May 14 Javascript
JavaScript中数组去重的5种方法
Jul 04 Javascript
解决Window10系统下Node安装报错的问题分析
Dec 13 #Javascript
浅析Jquery操作select
Dec 13 #Javascript
Vue.js使用v-show和v-if的注意事项
Dec 13 #Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
Dec 13 #Javascript
Es6 写的文件import 起来解决方案详解
Dec 13 #Javascript
JS实现图片垂直居中显示小结
Dec 13 #Javascript
Javascript this 函数深入详解
Dec 13 #Javascript
You might like
杏林同学录(一)
2006/10/09 PHP
global.php
2006/12/09 PHP
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
javascript 设计模式之单体模式 面向对象学习基础
2010/04/18 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
深入分析下javascript中的[]()+!
2015/07/07 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
Vue下的国际化处理方法
2017/12/18 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
JS实现拼图游戏
2021/01/29 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
[04:21]狐狸妈带你到现场 DOTA2 TI中国区预选赛线下赛路线指引
2014/05/22 DOTA
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
Python中函数的用法实例教程
2014/09/08 Python
机器学习python实战之决策树
2017/11/01 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
用python生成与调用cntk模型代码演示方法
2019/08/26 Python
如何解决安装python3.6.1失败
2020/07/01 Python
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
军训教官感言
2014/03/02 职场文书
求职自荐信怎么写
2014/03/06 职场文书
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
小学教师个人总结
2015/02/05 职场文书
业务员管理制度范本
2015/08/06 职场文书
七夕情人节问候语
2015/11/11 职场文书
浅谈Java父子类加载顺序
2021/08/04 Java/Android