Un osservabile ti consente di iscriverti solo mentre un soggetto ti consente sia di pubblicare che di iscriverti.
Quindi un soggetto consente ai tuoi servizi di essere utilizzati sia come editore che come abbonato.
A partire da ora, non sono così bravo, Observablequindi condividerò solo un esempio di Subject.
Comprendiamo meglio con un esempio di CLI angolare . Esegui i comandi seguenti:
npm install -g @angular/cli
ng new angular2-subject
cd angular2-subject
ng serve
Sostituisci il contenuto di app.component.htmlcon:
<div *ngIf="message">
{{message}}
</div>
<app-home>
</app-home>
Esegui il comando ng g c components/homeper generare il componente home. Sostituisci il contenuto di home.component.htmlcon:
<input type="text" placeholder="Enter message" #message>
<button type="button" (click)="setMessage(message)" >Send message</button>
#messageè la variabile locale qui. Aggiungi una proprietà message: string;
alla app.component.tsclasse di.
Esegui questo comando ng g s service/message. Questo genererà un servizio a src\app\service\message.service.ts. Fornisci questo servizio all'app .
Importa Subjectin MessageService. Aggiungi anche un argomento. Il codice finale dovrebbe apparire così:
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
}
}
Ora, iniettare questo servizio home.component.tse passarne un'istanza al costruttore. Fallo app.component.tsanche per questo . Utilizzare questa istanza del servizio per passare il valore #messagealla funzione di servizio 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);
}
}
All'interno app.component.ts, iscriviti e annulla l'iscrizione (per evitare perdite di memoria) a 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();
}
}
Questo è tutto.
Ora, qualsiasi valore inserito all'interno #messagedi home.component.htmldeve essere stampato {{message}}all'internoapp.component.html