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, Observable
quindi 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.html
con:
<div *ngIf="message">
{{message}}
</div>
<app-home>
</app-home>
Esegui il comando ng g c components/home
per generare il componente home. Sostituisci il contenuto di home.component.html
con:
<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.ts
classe 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 Subject
in 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.ts
e passarne un'istanza al costruttore. Fallo app.component.ts
anche per questo . Utilizzare questa istanza del servizio per passare il valore #message
alla 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 #message
di home.component.html
deve essere stampato {{message}}
all'internoapp.component.html