Angular学习笔记6: 在页面中显示列表(*ngFor/*ngIf)

继学习笔记5以后,可以将一个Object对象显示在模版文件中(html)

真正在项目中,数据是来自后端服务器返回的,此时先创建一些模拟的数据。

1.创建模拟的数据

在 src/app/ 文件夹中创建一个名叫 mock-heroes.ts 的文件。


 
 
  1. wjydeMacBook-Pro:app wjy$ ng generate class mock-heroes
  2. CREATE src/ app/ mock- heroes. ts (28 bytes)

定义一个包含十个Hero(Hero类型)的常量数组 HEROES,并导出它。


 
 
  1. import {Hero} from './hero';
  2. export const HEROES: Hero[] = [
  3. { id: 11, name: 'Mr. Nice'},
  4. { id: 12, name: 'Narco'},
  5. { id: 13, name: 'Bombasto'},
  6. { id: 14, name: 'Celeritas'},
  7. { id: 15, name: 'Magneta'},
  8. { id: 16, name: 'RubberMan'},
  9. { id: 17, name: 'Dynama'},
  10. { id: 18, name: 'Dr IQ'},
  11. { id: 19, name: 'Magma'},
  12. { id: 20, name: 'Tornado'}
  13. ];
  14. export class MockHeroes {
  15. }

2.显示创建的数据

在HeroesComponent页面上显示这些数据,

  • 先在HeroesComponent类文件中导入在mock-heroes.ts 的HEROES,
import {HEROES} from '../mock-heroes';
 
 
  • 在HeroesComponent类文件中添加一个属性:heroes,使其等于导入的HEROES数组,这样可以在HeroesComponent类文件中使用HEROES数组
heroes = HEROES;
 
 

3.使用*ngFor将这些数据依次展示出来

打开 HeroesComponent 的模板文件(html),并做如下修改:

  • 在顶部添加 <h2>

  • 然后添加表示无序列表的 HTML 元素(<ul>

  • 在 <ul> 中插入一个 <li> 元素,以显示单个 hero 的属性。

  • 点缀上一些 CSS 类(稍后你还会添加更多 CSS 样式)。


 
 
  1. <h2>My Heroes </h2>
  2. <ul class="heroes">
  3. <li *ngFor="let hero of heroes">
  4. <span class="badge">{{hero.id}} </span> {{hero.name}}
  5. </li>
  6. </ul>

*ngFor 是一个 Angular 的复写器(repeater)指令。 它会为列表中的每项数据复写它的宿主元素。

在这个例子中

  • <li> 就是 *ngFor 的宿主元素(会将<li>标签中包含的所有元素全部遍历)。

  • heroes 就是来自 HeroesComponent 类的列表。

  • 当依次遍历heroes这个列表时,hero 会为每个迭代保存当前的数据对象。

完成以后的界面如下:

注意:⚠️ *ngFor的   *  不能丢掉

4.为HeroesComponent添加私有样式

在此之前,在 styles.css 中为整个应用设置了一些基础的样式,但是那些并不适用于现在这个列表,所以,要为这些列表写自己的私有的样式。

定义私有样式的方式:


 
 
  1. import {Component, OnInit} from '@angular/core';
  2. import {Hero} from '../hero';
  3. import {HEROES} from '../mock-heroes';
  4. @Component({
  5. selector: 'app-heroes',
  6. templateUrl: './heroes.component.html',
  7. styles: [ 'li{background-color: aliceblue}']
  8. })
  9. export class HeroesComponent implements OnInit {
  10. hero: Hero = {
  11. id: 1,
  12. name: 'Windstorm',
  13. };
  14. heroes = HEROES;
  15. constructor() {
  16. }
  17. ngOnInit() {
  18. }
  19. }

 
 
  1. import {Component, OnInit} from '@angular/core';
  2. import {Hero} from '../hero';
  3. import {HEROES} from '../mock-heroes';
  4. @Component({
  5. selector: 'app-heroes',
  6. templateUrl: './heroes.component.html',
  7. styleUrls: [ './heroes.component.css']
  8. })
  9. export class HeroesComponent implements OnInit {
  10. hero: Hero = {
  11. id: 1,
  12. name: 'Windstorm',
  13. };
  14. heroes = HEROES;
  15. constructor() {
  16. }
  17. ngOnInit() {
  18. }
  19. }

在这里,才用第二种方式去添加样式,打开heroes.component.css文件中添加一下样式:


 
 
  1. .selected {
  2. background-color: #CFD8DC !important;
  3. color: white;
  4. }
  5. .heroes {
  6. margin: 0 0 2em 0;
  7. list-style-type: none;
  8. padding: 0;
  9. width: 15em;
  10. }
  11. .heroes li {
  12. cursor: pointer;
  13. position: relative;
  14. left: 0;
  15. background-color: #EEE;
  16. margin: . 5em;
  17. padding: . 3em 0;
  18. height: 1.6em;
  19. border-radius: 4px;
  20. }
  21. .heroes li .selected :hover {
  22. background-color: #BBD8DC !important;
  23. color: white;
  24. }
  25. .heroes li :hover {
  26. color: #607D8B;
  27. background-color: #DDD;
  28. left: . 1em;
  29. }
  30. .heroes .text {
  31. position: relative;
  32. top: - 3px;
  33. }
  34. .heroes .badge {
  35. display: inline-block;
  36. font-size: small;
  37. color: white;
  38. padding: 0.8em 0.7em 0 0.7em;
  39. background-color: #607D8B;
  40. line-height: 1em;
  41. position: relative;
  42. left: - 1px;
  43. top: - 4px;
  44. height: 1.8em;
  45. margin-right: . 8em;
  46. border-radius: 4px 0 0 4px;
  47. }

刷新浏览器,看到如下界面:

5.使用户在列表中点击一个hero时,该组件应该在页面底部显示所选hero的详情

  • 用户点击,就要添加一个点击事件
<li *ngFor="let hero of heroes" (click)="onSelect(hero)">
 
 

click 外面的圆括号会让 Angular 监听这个 <li> 元素的 click 事件。 当用户点击 <li> 时,Angular 就会执行函数 onSelect(hero)

  • 添加 click 事件处理器

添加一个selectedHero标示被选中的hero,在onSelect方法中,将选中的那个hero赋值给selectHero。


 
 
  1. selectedHero: Hero;
  2. onSelect(hero: Hero): void {
  3. this.selectedHero = hero;
  4. }
  • 修改模版

 
 
  1. <h2>My Heroes </h2>
  2. <ul class="heroes">
  3. <li *ngFor="let hero of heroes" (click)="onSelect(hero)">
  4. <span class="badge">{{hero.id}} </span> {{hero.name}}
  5. </li>
  6. </ul>
  7. <h2>{{selectedHero.name}} Details </h2>
  8. <div> <span>id: </span>{{selectedHero.id}} </div>
  9. <div>
  10. <label>name:
  11. <input [(ngModel)]="selectedHero.name" placeholder="name">
  12. </label>
  13. </div>

保存刷新浏览器,不正常显示了,打开控制台发现保错:

这里是因为:当启动应用时,selectedHero这个属性还没有初始化,此时的selectedHero=undefined,此时就用*ngIf 当selectedHero===undefined时,让这段隐藏,在selectedHero!==undefined时,在显示出来。用一个<div></div>将其包起来。

注意:⚠️ *ngIf的   *  不能丢掉

具体如下:


 
 
  1. <div *ngIf="selectedHero">
  2. <h2>{{selectedHero.name}} Details </h2>
  3. <div> <span>id: </span>{{selectedHero.id}} </div>
  4. <div>
  5. <label>name:
  6. <input [(ngModel)]="selectedHero.name" placeholder="name">
  7. </label>
  8. </div>
  9. </div>

此时再次保存,浏览区刷新就不会报错。界面显示正常。当点击hero列表的时候,才会出现具体的hero信息。

6.给选中的hero添加样式

Angular 的CSS类绑定机制让根据条件添加或移除一个 CSS 类变得很容易。 只要把 [class.some-css-class]="some-condition" 添加到你要施加样式的元素上就可以了。

在 HeroesComponent 模板中的 <li> 元素上添加 [class.selected] 绑定,即:

[class.selected]="hero === selectedHero"
 
 

在这里添加了,样式的判断条件,只有爱hero和selectHero两者相等的时候,这个样式才成立。即:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值