就我现在的认识,路由($route)这个东西(也许可以加上$location)可以说是ng最重要的东西了。因为angular目前最重要的作用就是做单页面webApp,而路由这个东西是能做到页面跳转的关键。

1.单页面webApp

为什么叫单页面webApp?因为它是单页面的。。。。额。。。关键在于我们看到的不少webApp是多页面的啊,可以从一页跳到另一页。嗯,看起来是这样,不过实际上这几页实际还是一个页面,因为它们是一次性加载进来的,至于为啥会有跳转效果呢?嗯,有点儿像选项卡,嗯。其实现原理在html5之前是通过hashbang,H5是History。这篇文章主要讨论的是hashbang。为什么要用#呢?当然我们可以直接多页面,就跟做网站一样。但是这么做最大的问题是:每次切换都需要重新加载页面。我们可以接受进入一个app的时候多花几秒加载,而在使用App的时候切换页面的时候多等个一两秒就会给用户一种这app好卡的感觉。

另外webApp另外一个好处就是可以减轻服务器压力,后台只管给数据。嗯,其实我不是很懂这一点。。以后再补充吧。

2.路由(ng-route)

那么怎么把单页面webapp(SPA)做成多页面的样子呢?就是怎么来管理这些页面呢?就要靠路由了。

来个案例,这是一个信息管理系统,管用户注册,注销,用户列表,用户详情之类的东西。

<!DOCTYPE html>
<html lang="en" ng-controller="userlist">
<head>
<meta charset="UTF-8">
</head>
<body>
<div>
<table>
<tr ng-repeat="x in data" ng-click="detail($index)">
<td>{{ x.name }}:{{ x.password }}<a href="#ddd/{{$index}}">查看详情</a></td>
</tr>
</table>
</div>
</body>
</html>

html我就粘一部分,这一部分是显示用户列表的,点击对应用户需要显示它们的对应信息。为什么选这一部分,是因为这里需要做地址传参。

再看看对应的管路由跳转的js代码

m1.config(["$routeProvider",function($routeProvider){
$routeProvider.when("/aaa",{
templateUrl:"register.html",
controller:"register"
}).when("/bbb",{
templateUrl:"cancel.html",
controller:"cancel"
}).when("/ccc",{
templateUrl:"userlist.html",
controller:"userlist"
})
.when("/ddd/:index",{
templateUrl:"detail.html",
controller:"detail"
})
.otherwise({redirectTo:"/aaa"});
}])

其中

.when("/ddd/:index",{
templateUrl:"detail.html",
controller:"detail"
})

对应着用户列表页面。

首先,m1.config(["$routeProvider",function($routeProvider)])是注入模块的过程,因为ng-route是一个独立于ng之外的模块,是一个独立的js文件。

然后,when函数的参数,第一个是url地址(后面接的:index待会讲地址传参的时候再说)。templateUrl是转到的页面地址(内容少的话可以用template),controller写跳转到的页面的控制器。

跳转之后的页面url大概是长这样的:http://localhost:63342/%E8%B7%AF%E7%94%B1/index.html#/ddd

最后说说地址传参的问题,在详细页中,我们只需要显示对应的一个人的信息,就是说不管你点谁的详情显示的一个页面,但是你需要告诉详情页点击的究竟是哪个按钮,我该渲染哪个。代码里的:index代表着你点击的用户的列表索引(就是你点击的是第几个用户),传索引是因为用户信息数据是用数组存的。在列表页中,这个变量叫index或者啥的都无所谓,因为这只是占了个坑,代表这里传的值可以用这个变量来取(当然这个名字在跳转过去的详情页是有用的)。再看看对应的html怎么写的

<tr ng-repeat="x in data" ng-click="detail($index)">
<td>{{ x.name }}:{{ x.password }}<a href="#ddd/{{$index}}">查看详情</a></td>
</tr>

这里的$index对应的就是点击的这个tr在这个表格中的索引,确切的来说是x是data中的第几项。index就对应了{{$index}}

如果加上了参数的话,跳转页的url长这样http://localhost:63342/%E8%B7%AF%E7%94%B1/index.html#/ddd/0

后面多加的这个0就是传的参数了,想要在跳转页取到这个参数,可以用$routeParams

m1.controller("detail",["$scope","$routeParams",function($scope,$routeParams){
$scope.index=$routeParams.index;
}]);

就是说,这里$routeParams.index中的index对应着在when函数中写的那个。

说句题外话,之前我不用地址传参的时候,实现”多页面"通信的方式是在$rootScope里写个属性存上要传的数据,毕竟ng只有一个$rootScope。虽然没想出这么做有什么不妥,但是内心当中总觉得好别扭。。

下一节说说自定义指令。

AngularJS学习笔记(三) 单页面webApp和路由(ng-route)的更多相关文章

  1. angularjs学习笔记三——directive

    AngularJS 通过被称为 指令 的新属性来扩展 HTML. 正如你所看到的,AngularJS 指令是以 ng 作为前缀的 HTML 属性. HTML5 允许扩展的(自制的)属性,以 data- ...

  2. 小程序学习笔记三:页面文件详解之视图层WXML、WXS、WXSS文件

      视图层:Pages主要有 wxml页面文件和模板文件.wxs脚本文件.wxss样式文件:component是抽取出来的业务单元,同样拥有wxml页面文件和模板文件.wxs脚本文件.wxss样式文件 ...

  3. AngularJs学习笔记-表单处理

    表单处理 (1)Angular表单API 1.模板式表单,需引入FormsModule 2.响应式表单,需引入ReactiveFormsModule   (2)模板式表单 在Angular中使用for ...

  4. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  5. angular学习笔记(三十一)-$location(2)

    之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍 ...

  6. AngularJs学习笔记--Forms

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/forms 控件(input.select.textarea)是用户输入数据的一种方式.Form(表单) ...

  7. AngularJs学习笔记--bootstrap

    AngularJs学习笔记系列第一篇,希望我可以坚持写下去.本文内容主要来自 http://docs.angularjs.org/guide/ 文档的内容,但也加入些许自己的理解与尝试结果. 一.总括 ...

  8. AngularJs学习笔记--Using $location

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/dev_guide.services.$location 一.What does it do? $loc ...

  9. AngularJs学习笔记--Creating Services

    原版地址:http://docs.angularjs.org/guide/dev_guide.services.creating_services 虽然angular提供许多有用的service,在一 ...

随机推荐

  1. Highways - poj 2485 (Prim 算法)

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24383   Accepted: 11243 Description T ...

  2. Downloading jQuery

    Compressed and uncompressed copies of jQuery files are available. The uncompressed file is best used ...

  3. 趣味编程:C#中Specification模式的实现(参考答案 - 下)

    一篇文章中我们利用C#语言的特性实现了一种轻量级的Specification模式,它的关键在于抛弃了具体的Specification类型,而是使用一个委托对象代替唯一关键的IsSatisfiedBy方 ...

  4. 【BZOJ2844】albus就是要第一个出场 高斯消元求线性基

    [BZOJ2844]albus就是要第一个出场 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2 ...

  5. EasyNVR完美搭配腾讯云CDN/阿里云CDN进行RTMP、HLS直播加速的使用说明

    1.相关资料入口 腾讯云LVB EasyNVR.com 2.加速说明 2.1. 腾讯LVB加速 2.1.1. 开通服务 腾讯云视频LVB开通入口 2.1.2. 登录进入控制台 腾讯云直播控制台 2.1 ...

  6. 第二课 创建http server

    nodejs 不需要单独安装服务器软件 tomcat .apache. iis 看下面的代码创建了http服务器,并输出一些简单的响应内容 //引入http 模块 var http = require ...

  7. iOS和Android后台机制对比

    转自:http://blog.csdn.net/zsch591488385/article/details/27232881 一.iOS的“伪后台”程序 首先,先了解一下ios 中所谓的「后台进程」到 ...

  8. Python菜鸟之路:前端HTML基础

    前面的章节中,Python的基本知识已经差不多介绍完了.本节介绍HTML相关的知识.需要着重声明的是,前端知识是非常非常重要的知识,以我实际项目经验来看,一个项目的瓶颈在设计和前端.设计就先不说了,前 ...

  9. Django之权限用法

    **记住每一个url都是一个权限** 注册 可插拔试的权限,可以先写其他的逻辑,在最后再把权限加上 将rbac组件拷贝到项目上,注册项目 修改表结构 将写好的用户表对rbac的User表进行一对一的关 ...

  10. linux c编程:Posix消息队列

    Posix消息队列可以认为是一个消息链表. 有足够写权限的线程可以往队列中放置消息, 有足够读权限的线程可以从队列中取走消息 在某个进程往一个队列写入消息前, 并不需要另外某个进程在该队列上等待消息的 ...