angular-ui-router是一个第三方路由框架,允许通过状态机制组织接口,而不是简单的URL路由。
小试牛刀
在开始之前需要安装一下本地服务:1
2
3npm install http-server -g //全局安装模块
http-server -c-1 -o //强制浏览器不缓存,确保每次代码修改的更新
首先是项目结构1
2
3
4
5
6
7|-- app.js
|-- index.html
|-- libs
| |-- angular-ui-router.js
| |-- angular.js
|-- view
|-- about.html
其次是html结构1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<head>
<meta charset="utf-8">
<title>测试</title>
<script src="libs/angular.js"></script>
<script src="libs/angular-ui-router.js"></script>
<script src="app.js"></script>
</head>
<body ng-app="main">
<a ui-sref='home'>主页</a>
<a ui-sref='about'>关于</a>
<a ui-sref='news'>消息</a>
<ui-view></ui-view>
</body>
</html>
ui-sref指令指定路由的名称
入口文件app.js1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21angular.module("main", ['ui.router'])
.config(function ($stateProvider) {
$stateProvider
.state("home", {
url: "/home",
template: "<h1>home</h1>"
})
.state("about", {
url: "/about",
templateUrl: "/view/about.html"
})
.state("news", {
url: "/news",
templateProvider: function () {
return "<h1>news</h1>"
}
})
})
.run(function ($state) {
$state.go("home")
})
- 声明一个模块
main,以及它的依赖模块['ui.router'],.config()方法对其配置。 $stateProvider服务是ui.router提供,配置路由名称、跳转的地址以及它的html模板来源,这边写了三种。常用的就是第二种templateUrl为了更好的模块化。$state.go("home")指定初始是的路由在哪儿。
渐入佳境
ui-router在一个路由组件内可以设置多个命名视图,让组件的结构更加自由和灵活。
1 | <body ng-app="main"> |
1 | $stateProvider |
ui-view可以作为元素的属性指定它的路由视图,其与views配置对象内的键值一一对应
出神入化
项目结构1
2
3
4
5
6
7
8|-- app.js
|-- index.html
|-- libs
| |-- angular-ui-router.js
| |-- angular.js
|-- view
|-- about.html
|-- news.html
1 | <head> |
1 | //about.html |
1 | //news.html |
1 | //app.js |
- 可以看到about页面嵌套了一层路由,分别是one、two页面,注意这两个子页面的路由也是在这边一起配置,嵌套的路由运行逻辑是首先载入父视图然后是子视图, 如
about.one,且父子间必须用.分隔开。 - 这边遇到一个问题,当你切换到about页面但是里面的子视图是空的,因为你没有默认路由,可以在
controller里$state.go("about.one")指定。默认展示第一个视图。