
angular-ui-router是一个第三方路由框架,允许通过状态机制组织接口,而不是简单的URL路由。
小试牛刀
在开始之前需要安装一下本地服务:
npm install http-server -g //全局安装模块
http-server -c-1 -o //强制浏览器不缓存,确保每次代码修改的更新
首先是项目结构
|-- app.js
|-- index.html
|-- libs
| |-- angular-ui-router.js
| |-- angular.js
|-- view
|-- about.html
其次是html结构
<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.js
angular.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在一个路由组件内可以设置多个命名视图,让组件的结构更加自由和灵活。
<body ng-app="main">
<a ui-sref='home'>主页</a>
<div ui-view="home1"></div>
<div ui-view="home2"></div>
</body>
$stateProvider
.state("home", {
url: "/home",
views: {
home1: {
template: "<h1>home1</h1>"
},
home2: {
template: "<h1>home2</h1>"
}
}
})
ui-view
可以作为元素的属性指定它的路由视图,其与views
配置对象内的键值一一对应
出神入化
项目结构
|-- app.js
|-- index.html
|-- libs
| |-- angular-ui-router.js
| |-- angular.js
|-- view
|-- about.html
|-- news.html
<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>
//about.html
<div>
<h2>我是关于页面</h2>
<a ui-sref='about.one'>关于1</a>
<a ui-sref='about.two'>关于2</a>
<ui-view></ui-view> //这边和主页面的ui-view并不冲突
</div>
//news.html
<div>
<h2>我是新闻页</h2>
<ul>
<li ui-view="news1"></li>
<li ui-view="news2"></li>
</ul>
</div>
//app.js
angular.module("main", ['ui.router'])
.config(function ($stateProvider) {
$stateProvider
.state("home", {
url: "/home",
template: "<h1>home1</h1>"
})
.state("about", {
url: "/about",
templateUrl: "/view/about.html",
controller: function ($state) {
$state.go("about.one")
}
})
.state("about.one", {
url:"/about1",
template: "<h3>about1</h3>"
})
.state("about.two", {
url: "/about2",
template: "<h3>about2</h3>"
})
.state("news", {
url: "/news",
templateUrl: "/view/news.html",
controller: function ($state) {
$state.go("news.details")
}
})
.state("news.details", {
url: "/details",
views: {
news1: {
template: "<p>体育新闻</p>"
},
news2: {
template: "<p>娱乐新闻</p>"
}
}
})
})
.run(function ($state) {
$state.go("home")
})
- 可以看到about页面嵌套了一层路由,分别是one、two页面,注意这两个子页面的路由也是在这边一起配置,嵌套的路由运行逻辑是首先载入父视图然后是子视图, 如
about.one
,且父子间必须用.
分隔开。 - 这边遇到一个问题,当你切换到about页面但是里面的子视图是空的,因为你没有默认路由,可以在
controller
里$state.go("about.one")
指定。默认展示第一个视图。