添加仪表盘
本章节,我们将实现路由功能。
- 添加一个仪表盘视图。
- 在用户列表和仪表盘视图之间实现导航。
添加路由链接
除了把路由的 URL 粘贴到地址栏外,用户应该通过点击链接进行导航。
添加一个 <nav>
元素,并在其中放一个 <a>
元素,当点击它时,就会触发一个到 UsersComponent 的导航。 修改过的 AppComponent 模板(src/app/app.component.html )如下:
<h1>{{title}}</h1>
<nav>
<a routerLink="/users">Users</a>
</nav>
<router-outlet></router-outlet>
<app-messages></app-messages>
routerLink 属性的值为 "/users",路由器会用它来匹配出指向 UsersComponent 的路由。 routerLink 是 RouterLink 指令的选择器,它会把用户的点击转换为路由器的导航操作。 它是 RouterModule 中公开的另一个指令。
同时,为了让显示更加美观,我们需要在 src/app/app.component.css 文件中添加如下样式:
h1 {
font-size: 1.2em;
color: #999;
margin-bottom: 0;
}
h2 {
font-size: 2em;
margin-top: 0;
padding-top: 0;
}
nav a {
padding: 5px 10px;
text-decoration: none;
margin-top: 10px;
display: inline-block;
background-color: #eee;
border-radius: 4px;
}
nav a:visited, a:link {
color: #607d8b;
}
nav a:hover {
color: #039be5;
background-color: #cfd8dc;
}
nav a.active {
color: #039be5;
}
运行查看效果
执行 ng serve
命名以启动应用。访问http://localhost:4200/,页面会显示出了应用的标题和指向用户列表的链接,但并没有显示用户列表。
点击这个链接。地址栏变成了 /users, 并且显示出了用户列表。
添加仪表盘视图
当有多个视图时,使用路由会更有价值。不过目前还只有一个用户列表视图。
使用 CLI 添加一个 DashboardComponent:
ng generate component dashboard
从控制台可以看到生成了如下文件:
ng generate component dashboard
CREATE src/app/dashboard/dashboard.component.html (28 bytes)
CREATE src/app/dashboard/dashboard.component.spec.ts (649 bytes)
CREATE src/app/dashboard/dashboard.component.ts (281 bytes)
CREATE src/app/dashboard/dashboard.component.css (0 bytes)
UPDATE src/app/app.module.ts (847 bytes)
CLI 生成了 DashboardComponent 的相关文件,并把它声明到 AppModule 中。
修改 dashboard.component.html
修改 dashboard.component.html 如下:
<h3>Top Users</h3>
<div class="grid grid-pad">
<a *ngFor="let user of users" class="col-1-4">
<div class="module user">
<h4>{{user.name}}</h4>
</div>
</a>
</div>
这个模板用来表示由用户名字链接组成的一个阵列。
*ngFor
复写器为组件的 users 数组中的每个条目创建了一个链接。- 这些链接被 dashboard.component.css 中的样式格式化成了一些色块。
修改 dashboard.component.ts
DashboardComponent 这个类和 UsersComponent 类很像。
import { Component, OnInit } from '@angular/core';
import { User } from '../user';
import { UserService } from '../user.service';
@Component({
selector: 'app-dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.css']
})
export class DashboardComponent implements OnInit {
users: User[] = [];
constructor(private userService: UserService) { }
ngOnInit() {
this.getUsers();
}
getUsers(): void {
this.userService.getUsers()
.subscribe(users => this.users = users.slice(1, 5));
}
}
- 它定义了一个 users 数组属性。
- 它的构造函数希望 Angular 把 UserService 注入到私有的 userService 属性中。
- 在 ngOnInit() 生命周期钩子中调用 getUsers。
- 这个 getUsers 函数 slice 把要显示的用户的数量缩减为四个(取第二、第三、第四和第五)。
添加仪表盘到路由
要导航到仪表盘,路由器中就需要一个相应的路由。
把 DashboardComponent 导入到 AppRoutingModule 中:
import { DashboardComponent } from './dashboard/dashboard.component';
把一个指向 DashboardComponent 的路由添加到 AppRoutingModule.routes 数组中。
{ path: 'dashboard', component: DashboardComponent },
完整代码如下:
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { DashboardComponent } from './dashboard/dashboard.component';
import { UsersComponent } from './users/users.component';
const routes: Routes = [
{ path: 'dashboard', component: DashboardComponent },
{ path: 'users', component: UsersComponent }
];
@NgModule({
imports: [ RouterModule.forRoot(routes) ],
exports: [RouterModule]
})
export class AppRoutingModule { }
添加默认路由
当应用启动时,浏览器的地址栏指向了网站的根路径。 它没有匹配到任何现存路由,因此路由器也不会导航到任何地方。 <router-outlet>
下方是空白的。
要让应用自动导航到这个仪表盘,请把下列路由添加到 AppRoutingModule.Routes 数组中。
{ path: '', redirectTo: '/dashboard', pathMatch: 'full' },
这个路由会把一个与空路径“完全匹配”的 URL 重定向到路径为 '/dashboard' 的路由。
浏览器刷新之后,路由器加载了 DashboardComponent,并且浏览器的地址栏会显示出 /dashboard 这个 URL。效果如下:
完整的代码如下:
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { DashboardComponent } from './dashboard/dashboard.component';
import { UsersComponent } from './users/users.component';
const routes: Routes = [
{ path: '', redirectTo: '/dashboard', pathMatch: 'full' },
{ path: 'dashboard', component: DashboardComponent },
{ path: 'users', component: UsersComponent }
];
@NgModule({
imports: [ RouterModule.forRoot(routes) ],
exports: [RouterModule]
})
export class AppRoutingModule { }
添加仪表盘链接
在页面顶部导航区的增加仪表盘链接。实现各个链接在 DashboardComponent 和 UsersComponent 之间来回导航。
修改 AppComponent 的模板(src/app/app.component.html):
<h1>{{title}}</h1>
<nav>
<a routerLink="/dashboard">Dashboard</a>
<a routerLink="/users">Users</a>
</nav>
<router-outlet></router-outlet>
<app-messages></app-messages>
刷新浏览器,你就能通过点击这些链接在这两个视图之间自由导航了。