angular路由

路由配置:路由配置是一个Routes类型的数组

例如:

const routes:Routes = [
    {
        path: '', component: BuildDataComponent,
        children: [
            {path: '', redirectTo: 'addData'},
            {
                path: 'addData', component: AddDataComponent, data: {breadcrumb: 'aaa'}
            },
            {
                path: 'test1', component: test1Component, data: {breadcrumb: 'bbb'}
            },
            {
                path: 'test2', component: test2Component, data: {breadcrumb: 'ccc'}
            }
        ]
    }
];
创建根路由模块:

通过调用RouterModule.forRoot()方法来创建根路由模块,并将其导入到应用的根模块中
例如:

@NgModule({
   
    bootstrap: [App],
    declarations: [App, ExceptionComponent],
    imports: [
        RouterModule.forRoot(routes), // 
        RouterModule.forRoot()方法来创建根路由模块
    ]
})
添加RouterOutlet指令

RouterOutlet指令的作用是在组件的模板中开辟出一块区域,用于显示URL所对应的组件。Angular将在模板中使用了<router-outlet>标签的组件统称为路由组件。
例如:
<main class="main">
<router-outlet></router-outlet>
</main>

路由策略

路由策略决定angular将使用URL的哪一部分来和路由配置项的path属性进行匹配。angular提供了PathLocationStrategy和HashLocationStartegy两种路由策略,分别表示使用URL的path部分和hash部分来进行路由匹配。
1.HashLocationStartegy介绍
http://localhost:3000/#/list
(1)浏览器向服务器发送请求的时候不会带上hash部分的内容。#后面的部分是hash的内容
(2)更改url的hash部分不会向服务器重新发送请求,这就使得在进行跳转的时候不会引起页面的刷新和应用的重新加载。
2.PathLocationStrategy介绍
http://localhost:3000/list
作为angular的默认路由策略,其最大的优点是为服务器端的渲染提供了可能。
例如:
浏览器向服务器端发送请求http://localhost:3000/list,服务器可以通过解析URL的path部分/list得知所要访问的页面,对其进行渲染并将结果返回给浏览器。
使用PathLocationStrategy路由策略,必须满足三个条件
(1)浏览器需要支持HTML5的history.pushState()方法,这个方法可以使RouterLink指令在跳转时即使更改了URL的path部分,也不会引起页面的刷新。
(2)在服务器上进行设置,将应用的所有URL重定向到应用的首页,这是因为该应用所生成的URL在服务器上并不存在与相对应的文件结构,如果不进行重定向,服务器将返回404错误。
(3)需要为应用设置一个base路径,Angular可以以base路径为前缀来生成和解析URL。可以在index.html页面中<base>标签的href属性中设置,也可以通过向应用中注入APP_BASE_HREF变量来实现。
providers:[{provide:APP_BASE_HREF,useValue:'/app'}]

路由跳转

(1)指令跳转
使用RouterLink指令来完成跳转。可以被应用到任何HTML元素上,使页面跳转不需要依赖超链接。当routerLink处于激活状态时,该元素就可以获得routerLinkActive指定的css类.active。
例如

<div class="tab-header-item" [routerLink]="['currentData']" routerLinkActive="active" >
           我是谁
</div>

(2)使用代码跳转
可以使用Router.navigateByUrl()或Router.navigate()来完成。

路由参数

(1)path参数
path参数是通过解析url中的path部分来获取参数的,在定义一个配置项的path属性的时候,可以使用“/”字符来对path属性进行分段。如果一个分段以“ :”字符开头,则URL中的该分段进行匹配的部分将作为参数传递到组件中。
angular应用从一个页面跳转到另一个新的页面,实质上是从一个配置项跳转到另一个配置项。
(2)Query参数
每个配置项可以有任意多个查询参数,
http://localhost:3000/list?limit=5
也可以通过RouterLink指令给或者跳转的方法来赋值。
<a [routerLink]="['/list']" [queryParams]="{limit:5}">
this._router.navigate(['/list'],{queryParams:{limit:5}});
this._router.navigateByUrl('/list?limit=5');

子路由和附属Outlet

一、子路由
angular允许一个路由组件被嵌套到另一个路由组件中,从而建立路由的多级嵌套关系。children是用来配置子路由

const routes: Routes = [
    {
        path: '', component: DataGeneralViewComponent,
        children: [
            {path: '', redirectTo: 'currentData'},
            {
                path: 'currentData', component: DataViewComponent, data: {breadcrumb: 'aaa'},
            },
            {
                path: 'operatorData', component: DataOperatorHistoryComponent, data: {breadcrumb: 'bbb'}
            },
            {
                path: 'historyData', component: DataHistoryComponent, data: {breadcrumb: 'ccc'}
            },{
                path: 'test', component: DataTestComponent, data: {breadcrumb: 'ddd'}
            }
        ]
    }
];

二、Matrix参数

angular提供了Matrix参数,它通过在连接参数数组中插入一个对象来进行赋值。
例如

<a [routerLink]="['/detail',this.contact_id,{after:'2015-01-01',before:'2015-12-31'},'album']"
angular会将对象的属性转化成以“;”为分隔符的键值对,拼接到与该对象左边最近的url分段上。
http://localhost:3000/detail/6;after=2015-01-01;before=2015-12-31/album

三、附属Outlet
angular允许一个路由组件包含多个Outlet,从而可以在一个路由组件中同时显示多个组件。其中主要Outlet有且仅有一个,附属Outlet可以有任意多个,各个附属Outlet通过不同的命名加以区分。每个Outlet均可以通过路由配置来指定其可以显示的组件。
例如

export const rootRouterConfig: Routes = [
{path: 'detail/:id',component: DetailComponent,
 children: [
   {path: '',component: AnnotationComponent},
   {path:'album', component: AlbumComponent},
  //附属路由
   {path: 'annotation', component; AnnotationComponent,outlet:'aux'},
   {path: 'album', component; AlbumComponent,outlet:'aux'},
]}
]
路由拦截

angular的路由拦截允许从一个配置项跳转到另一个配置项之前执行指定的逻辑,并根据执行的结果来决定是否进行跳转。
CanActive:激活拦截
CanActiveChild:与CanActive类似,用于控制是否允许激活子路由配置项。
CanDeactivate:反激活拦截
Resolve:数据预加载拦截
CanLoad:模块加载拦截

模块的延迟加载

1.延迟加载实现

loadChildren指定了延迟加载模块的路径,#后面表示模块类名。
2.模块预加载

preload设置为true,加载方式由原来的延迟加载变为预加载。

3.模块加载拦截
CanLoad
例如:

@Injectable()
export class CanLoadGuard implements CanLoad{
    canLoad(route: Route){
       console.log(route.path);
       if(/*允许加载*/){
           return true;
       }else{
           return false;
       }
   }
}
在延迟加载配置项中指定CanLoad拦截服务
最后需要将CanLoad拦截服务注入到根模块中
@NgModule({
     providers: [CanLoadGuard]
})
export class AppModule{}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 摘要:在本教程中,Ahmed Bouchefra 介绍了angular路由器(router),以及如何使用它创建客...
    哈维尔23456阅读 3,277评论 0 3
  • 一:路由基础 什么是路由: 在web开发中,路由的概念由来已久,简而言之,就是利用URL的唯一性来指定特定的事物,...
    真的稻城阅读 6,018评论 2 7
  • 路由要解决的核心问题是通过建立URL和页面的对应关系,使得不同的页面可以用不同的URL表示。在angular中,页...
    oWSQo阅读 1,291评论 0 1
  • 第二节:路由介绍 1.生成新项目 ng new 项目名 --routing : 注意 --routing的作...
    咖啡浮点阅读 1,043评论 0 2
  • 也许这是我最后一次写关于Angular的文章,但也不一定,如果有机会我可能会继续吧,但今天的主题很明确就是路由。 ...
    我是上帝可爱多阅读 3,383评论 0 6