天天看点

路由路由是什么实现什么样的功能路由组成

路由是什么

Angular的路由器能让用户从一个

视图

导航到另一个视图

实现什么样的功能

  • 在地址栏输入URL,浏览器就会导航到相应的页面。
  • 在页面中点击链接,浏览器就会导航到一个新页面。
  • 点击浏览器的前进和后退按钮,浏览器就会在你的浏览历史中向前或向后导航。

路由组成

<base href> 元素

大多数带路由的应用都要在index.html的<head>标签下先添加一个<base>元素,来告诉路由器该如何合成导航用的URL。

<base href="/">

导入路由模块

`import { RouterModule , Routes

} from '@angular/router';

Angular的路由器是一个可选的服务,它用来呈现指定的URL所对应的视图。 它并不是Angular核心库的一部分,而是在它自己的@angular/router包中。 像其它Angular包一样,我们可以从它导入所需的一切。

配置路由

下面的例子创建了四个路由定义,并用

.forRoot

方法来配置路由器, 并把它的返回值添加到AppModule

的imports

数组中。

const appRoutes: Routes = [
  { path: 'crisis-center', component: CrisisListComponent },
  { path: 'hero/:id',      component: HeroDetailComponent },
  {
    path: 'heroes',
    component: HeroListComponent,
    data: { title: 'Heroes List' }
  },
  { path: '',
    redirectTo: '/heroes',
    pathMatch: 'full'
  },
  { path: '**', component: PageNotFoundComponent }
];

@NgModule({
  imports: [
    RouterModule.forRoot(
      appRoutes,
      { enableTracing: true } // <-- debugging purposes only
    )
    // other imports here
  ],
  ...
})
export class AppModule { }
           

这里的路由数组appRoutes

描述如何进行导航。 把它传给

方法并传给本模块的imports

数组就可以配置路由器。

每个

Route

都会把一个URL的path

映射到一个组件。 注意,path

不能以斜杠(/

)开头。 路由器会为解析和构建最终的URL,这样当我们在应用的多个视图之间导航时,可以任意使用相对路径和绝对路径。

第二个路由中的:id

是一个路由参数的令牌(Token)。比如/hero/42

这个URL中,“42”就是id

参数的值。 此URL对应的HeroDetailComponent

组件将据此查找和展现id

为42的英雄。 在本章中稍后的部分,我们将会学习关于路由参数的更多知识。

第三个路由中的data

属性用来存放于每个具体路由有关的任意信息。该数据可以被任何一个激活路由访问,并能用来保存诸如 页标题、面包屑以及其它静态只读数据。本章稍后的部分,我们将使用

resolve守卫

来获取动态数据。

第四个路由中的空路径(''

)表示应用的默认路径,当URL为空时就会访问那里,因此它通常会作为起点。 这个默认路由会重定向到URL /heroes

,并显示HeroesListComponent

最后一个路由中的**

路径是一个通配符。当所请求的URL不匹配前面定义的路由表中的任何路径时,路由器就会选择此路由。 这个特性可用于显示“404 - Not Found”页,或自动重定向到其它路由。

这些路由的定义顺序是刻意如此设计的。路由器使用先匹配者优先的策略来匹配路由,所以,具体路由应该放在通用路由的前面。在上面的配置中,带静态路径的路由被放在了前面,后面是空路径路由,因此它会作为默认路由。而通配符路由被放在最后面,这是因为它能匹配上每一个URL,因此应该只有在前面找不到其它能匹配的路由时才匹配它。

如果我们想要看到在导航的生命周期中发生过哪些事件,可以使用路由器默认配置中的enableTracing选项。它会把每个导航生命周期中的事件输出到浏览器的控制台。 这应该只用于调试。我们只需要把enableTracing: true

选项作为第二个参数传给

.forRoot()

方法就可以了。

link

路由出口

有了这份配置,当本应用在浏览器中的URL变为/heroes

时,路由器就会匹配到path

为heroes

,并在宿主视图中的* RouterOutlet

*之后显示HeroListComponent

组件。

<router-outlet></router-outlet>
<!-- Routed views go here -->