ข้อสังเกตช่วยให้คุณสมัครสมาชิกได้เฉพาะในขณะที่หัวเรื่องให้คุณเผยแพร่และสมัครสมาชิก
หัวเรื่องช่วยให้บริการของคุณสามารถใช้เป็นทั้งผู้เผยแพร่และผู้สมัครสมาชิก
ณ ตอนนี้ฉันไม่ดีเพื่อที่ดังนั้นฉันจะแบ่งปันเพียงตัวอย่างหนึ่งของการObservable
Subject
มาทำความเข้าใจให้ดีขึ้นด้วยตัวอย่างAngular CLI เรียกใช้คำสั่งด้านล่าง:
npm install -g @angular/cli
ng new angular2-subject
cd angular2-subject
ng serve
แทนที่เนื้อหาapp.component.html
ด้วย:
<div *ngIf="message">
{{message}}
</div>
<app-home>
</app-home>
รันคำสั่งng g c components/home
เพื่อสร้างคอมโพเนนต์โฮม แทนที่เนื้อหาhome.component.html
ด้วย:
<input type="text" placeholder="Enter message" #message>
<button type="button" (click)="setMessage(message)" >Send message</button>
#message
เป็นตัวแปรท้องถิ่นที่นี่ เพิ่มคุณสมบัติmessage: string;
ให้กับapp.component.ts
คลาสของ
เรียกใช้คำสั่งng g s service/message
นี้ src\app\service\message.service.ts
นี้จะสร้างบริการที่ มอบบริการนี้ให้กับแอพพ
นำเข้าลงในSubject
MessageService
เพิ่มหัวเรื่องด้วย รหัสสุดท้ายจะมีลักษณะเช่นนี้:
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class MessageService {
public message = new Subject<string>();
setMessage(value: string) {
this.message.next(value); //it is publishing this value to all the subscribers that have already subscribed to this message
}
}
ตอนนี้ฉีดบริการนี้home.component.ts
และส่งตัวอย่างของมันไปยังผู้สร้าง ทำเช่นนี้app.component.ts
ด้วย ใช้อินสแตนซ์ของบริการนี้เพื่อส่งผ่านค่าของ#message
ไปยังฟังก์ชันบริการsetMessage
:
import { Component } from '@angular/core';
import { MessageService } from '../../service/message.service';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent {
constructor(public messageService:MessageService) { }
setMessage(event) {
console.log(event.value);
this.messageService.setMessage(event.value);
}
}
ข้างในapp.component.ts
สมัครและยกเลิกการเป็นสมาชิก (เพื่อป้องกันการรั่วไหลของหน่วยความจำ) ไปที่Subject
:
import { Component, OnDestroy } from '@angular/core';
import { MessageService } from './service/message.service';
import { Subscription } from 'rxjs/Subscription';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent {
message: string;
subscription: Subscription;
constructor(public messageService: MessageService) { }
ngOnInit() {
this.subscription = this.messageService.message.subscribe(
(message) => {
this.message = message;
}
);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
แค่นั้นแหละ.
ตอนนี้ค่าใด ๆ เข้ามาภายใน#message
ของhome.component.html
จะได้รับการพิมพ์{{message}}
ภายในapp.component.html