这一篇是纪录阅读官方文件 Add services 的笔记内容。
本篇的内容是接续 Day08 的後续内容。
到目前为止,我们元件中接收资料都是以同步的形式接收资料库中的资料,但是,在实务上的运用不是用这种形式来接收资料的,而是用非同步的方式去远端的服务器端取得所需的资料。
所以,我们会利用 Angular 中的 HttpClient.get 的方式来达成非同步从远端 server 取得资料的机制。
在 Angular 中的 HttpClient.get() 是会回传一个 Observable 的结果。
所以,我们要引入一些来自 RxJS 的内容来更改一下原本的 HersoService 档案的回传资料型别,然後,改一下原本的 getHeroes 函式的回传资料型别
--- hero.service.ts ---
import { HERO } from './hero';
import { HEROES } from './mock-heroes';
import { Observable, of } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class HeroService {
// ...
getHeroes(): Observable<HERO[]> {
const heroes = of(HEROES);
return heroes;
}
}
可以看到上面的范例有写 of(HEROES) ,它会回传一个 Observable<HERO[]>,它会发送出一个单一值,这个值是一个英雄资料的阵列。
因为,在 HeroService 的回传资料型别已经改成 Observable<Hero[]>,所以,我们要更改一下 HeroComponent 的 getHeroes 的内容
--- heroes.component.ts ---
getHeroes(): void {
this.heroService.getHeroes()
.subscribe(heroes => this.heroes = heroes);
}
加入 Observable 到我们回传的资料格式之後,这个回传的机制就会等待 Observable 发送出含有英雄资料的阵列,接着,才会执行 subscribe 的内容,也就是将发送出来的阵列设给 HeroComponent 的 heroes 中。
接下来我们要新增 MessageComponent 和 MessageService,
MessageComponent 会负责展示讯息在画面的底部,
MessageService 会负责传送要被呈现的讯息内容
输入 ng generate component messages
,新增这个元件之後,再把它加入到 app.component.html。
接着,输入 ng generate service message
来新增这个服务,然後,在它的档案内容加入以下的内容,内容就是把 cache 住的讯息内容加入其他内容或者清除这个 cache 的内容。
--- message.service.ts ---
@Injectable({
providedIn: 'root',
})
export class MessageService {
messages: string[] = [];
add(message: string) {
this.messages.push(message);
}
clear() {
this.messages = [];
}
}
接下来,我们把 MessageService 注入到 HeroService 中,
并且将 MessageService 的加入讯息内容的功能,加到 getHeroes 中
--- hero.service.ts ---
import { MessageService } from './message.service';
export class HeroService {
constructor(private messageService:MessageService) { }
getHeroes(): Observable<HERO[]> {
const heroes = of(HEROES);
this.messageService.add('HeroService: fetched heroes'); // 加入MessageService服务
return heroes;
}
}
因为 MessagesComponent 元件是负责将 cache 的讯息呈现出来,所以,也要将 MessageService 的内容引入这个元件中
--- messages.component.ts ---
import { MessageService } from '../message.service';
@Component({
// ...
})
export class MessagesComponent implements OnInit {
constructor(public messageService:MessageService) { }
}
Note:
这边要注意一下,我们在建构式将 messageService 设为 public 成员,因为,未来它会被样板中的元素做连结,若用 private 来宣告它的话,就没有办法在样板中调用它。
Angular 只有连结 public 的元件属性
接下来就把 MessageService 的内容加到 MessagesComponent 的样板中吧~
--- messages.component.html ---
<div *ngIf="messageService.messages.length">
<h2>Messages</h2>
<button class="clear"
(click)="messageService.clear()">Clear messages</button>
<div *ngFor='let message of messageService.messages'> {{message}} </div>
</div>
这边可以注意到一点,有特别加了 *ngIf 的判定,来防止当 messageService.messages 没有任何内容的时候,浏览器会报错。
接下来,我们也要将 messageService 加入到 HeroComponent 中,让当有英雄被点击後,被点选的英雄资讯会出现在 messageService 的提示讯息中。
import { MessageService } from '../message.service';
@Component({
// ...
})
export class HeroesComponent implements OnInit {
// ...
constructor(private heroService: HeroService, private messageService: MessageService) { }
onSelect(hero: Hero): void {
this.selectedHero = hero;
this.messageService.add(`HeroesComponent: Selected hero id=${hero.id}`);
}
}
完成以上的内容之後,就可以看到以下的操作动画成果罗~
这边做个总结
美国政府在2014年为了加强公部门的资安防护能力,颁布了NIST (NIST Cybersecuri...
之前在开发表单的时候,我们都是使用 Angular 所提供的验证器来验证表单栏位里的值是否符合我们...
今天来总结一下该如何将档案从本地数据库 push 到 GitHub 上,写个简单的懒人包,也算再复习...
如果画面太小或看不清楚,可移驾至 https://www.youtube.com/watch?v=...
大家好我是乌木白,今日要和大家分享如何安装Git的环境! 如何安装Git的环境 安装在 Windo...