service : 櫃台
資料: 留言
component:人(A 和 B)
A 請人把留言送回 A,B 把留言 放到櫃檯,C 把留言 放到櫃檯
註冊並建立具連動性的值 - 多地點直接替換,一定要先註冊
export class Message {
constructor(private text: string,
private error: boolean = false) { }
}
import { Injectable } from '@angular/core';
import { Message } from '../model/message';
@Injectable({
providedIn: 'root'
})
export class MessageService {
// 基本上就是一個 有參數的函式
private handler: (m: Message) => void;
get getHandler() {
return this.handler;
}
reportMessage(msg: Message) {
if (this.handler != null) {
// 執行取得的 函式並將參數帶進去
this.handler(msg);
}
}
registerMessageHandler(handler: (m: Message) => void) {
// 將函式覆蓋掉當前的 handler
this.handler = handler;
}
}
lastMessage: Message;
constructor(private messageService: MessageService) {
// 註冊 一個函式 m => this.lastMessage = m
messageService.registerMessageHandler(m => this.lastMessage = m);
messageService.reportMessage(new Message('盧那', true));
}
// 傳送 值 替代 註冊Key(this.lastMessage) 的 值
setMessage(text: string) {
this.messageService.reportMessage(new Message(text, true));
}
<h1>資料都給我</h1>
<p>{{lastMessage | json}}</p>
<button type="button" (click)="setMessage('蘋果')">message 資料變成 蘋果</button>
<button type="button" (click)="setMessage('魔法')">message 資料變成 魔法</button>