听说angular4整了一个超级牛叉的路由模块…
路由概念一览
Routes
路由配置,保存着哪个URL对应展示哪个组件,以及在哪个RouterOutlet中显示组件。
RouterOutlet
在html中标记路由内容呈现位置的占位符指令。
Router
负责在运行时执行路由的对象,可以通过调用其navigate()和navigateByUrl()方法来导航到一个指定的路由。
RouterLink
在html中声明路由导航用的指令。
ActivetedRouter
当前激活的路由对象,保存着当前路由的信息,如路由地址,路由参数等。
实际上手
创建带有路由模块的项目架构
1 | ng new projectName -routing |
路由的配置模块
1 | // app-routing.module.ts |
路由跳转
声明式
1 | <!-- 注意点:路径必须用'/开头(导航到跟路由)',并且要用'[]'包裹起来 --> |
命令式
1 | import { Router } from "@angular/router" |
路由传参
查询参数
/product?id=1&name=2 —> ActivetedRoute.queryParams[id];
代码:1
2<!-- id即是要传的参数(这个id将以?的方式拼接,形如:...product?id=1) -->
<a [routerLink]="['/product']" [queryParams]="{id:1}">商品详情</a>
1 | // 组件类中 |
路径传参
{path:/product/:id} —> /product/1 —> ActivetedRoute.params[id];
代码:1
2// 路由配置中
{path: product/:id,component:xxComponent}
1 | <!-- 用navigate导航也是一样的 --> |
1 | ... |
配置传参
{path:/product,component:xxComponent,data:[{isProd:true}]
} —> ActivetedRoute.data[0][isProd];
辅助路由
1 | <router-outlet></router-outlet> |
1 | // 这里配置哪些组件能够显示到‘aux’这个插座上,只要有outlet属性,就说明这是辅助路由的配置 |
1 | <!-- 这里的outlets只是控制辅助路由的切换(独立变化,与主路由链接无关)(辅助路由的URL是用'()'包起来的) --> |
路由守卫
CanActivate
场景:用户未登陆不允许进入该路由页面1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// guard/login.guard.ts
import { CanActivate } from '@angular/router'
export class LoginGuard implements CanActivate {
canActivate() { // 这个方法要反回一个布尔值,根据这个布尔值看你是否有权限进到这个路由
let loggedIn: boolean = Match.random() < 0.5 // 用随机数的方式来模拟看用户是否登陆
if(!loggedIn) {
alert('未登录,不能进入该页面')
}
return loggedIn
}
}
// 路由配置信息里面加入一个属性
import { LoginGuard } from "./guard/login.guard"
{path: 'product/:id',component:ProductComponent,...,canActivatave:[LoginGuard]}
// 在providers属性中注入LoginGuard以实例化
@NgModule({
...
providers: [LoginGuard]
})
CanDeactivate
场景:用户要离开时,提醒他保存表单信息1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// guard/unsaved.guard.ts
import { CanDeactivate } from '@angular/router'
import { ProductComponent } from '../product/product.component' // 引入你要保护的组件
export class UnsavedGuard implements CanDeactivate<ProductComponent> { // 这里要指定一个泛型指定你要保护谁
canActivate(component: ProductComponent) { // 这里我们可以拿到受保护的组件,判断它是否具备离开的条件
return window.confirm('你还没有保存,确定要离开吗?')
}
}
// 路由配置信息里面加入一个属性
import { UnsavedGuard } from "./guard/unsaved.guard"
{path: 'product/:id',component:ProductComponent,...,canDeactivatave:[UnsavedGuard]}
// 在providers属性中注入LoginGuard以实例化
@NgModule({
...
providers: [LoginGuard,UnsavedGuard]
})
Resolve
在进入路由页面之前,预先从服务器上获取到想要的数据。而后带这这些数据进入路由页面,用户体验更佳1
// 太难了...