Sebuah diamati memungkinkan Anda untuk berlangganan hanya sedangkan subjek memungkinkan Anda untuk kedua mempublikasikan dan berlangganan.
Jadi subjek memungkinkan layanan Anda digunakan sebagai penerbit dan pelanggan.
Sampai sekarang, saya tidak begitu pandai Observable
sehingga saya hanya akan membagikan contoh Subject
.
Mari kita mengerti lebih baik dengan contoh CLI Angular Jalankan perintah di bawah ini:
npm install -g @angular/cli
ng new angular2-subject
cd angular2-subject
ng serve
Ganti konten app.component.html
dengan:
<div *ngIf="message">
{{message}}
</div>
<app-home>
</app-home>
Jalankan perintah ng g c components/home
untuk menghasilkan komponen rumah. Ganti konten home.component.html
dengan:
<input type="text" placeholder="Enter message" #message>
<button type="button" (click)="setMessage(message)" >Send message</button>
#message
adalah variabel lokal di sini. Tambahkan properti message: string;
ke kelas app.component.ts
's.
Jalankan perintah ini ng g s service/message
. Ini akan menghasilkan layanan di src\app\service\message.service.ts
. Berikan layanan ini ke aplikasi .
Impor Subject
ke MessageService
. Tambahkan subjek juga. Kode akhir akan terlihat seperti ini:
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
}
}
Sekarang, suntikkan layanan ini home.component.ts
dan berikan instance ke konstruktor. Lakukan ini app.component.ts
juga. Gunakan contoh layanan ini untuk meneruskan nilai #message
ke fungsi layanan 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);
}
}
Di dalam app.component.ts
, berlangganan dan berhenti berlangganan (untuk mencegah kebocoran memori) ke 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();
}
}
Itu dia.
Sekarang, setiap nilai masuk dalam #message
dari home.component.html
akan dicetak ke {{message}}
dalamapp.component.html