Un observable vous permet de vous abonner uniquement alors qu'un sujet vous permet à la fois de publier et de vous abonner.
Un sujet permet donc à vos services d'être utilisés à la fois comme éditeur et comme abonné.
Pour l'instant, je ne suis pas si bon dans Observablece domaine, je ne partagerai donc qu'un exemple de Subject.
Comprenons mieux avec un exemple de CLI angulaire . Exécutez les commandes ci-dessous:
npm install -g @angular/cli
ng new angular2-subject
cd angular2-subject
ng serve
Remplacez le contenu de app.component.htmlpar:
<div *ngIf="message">
{{message}}
</div>
<app-home>
</app-home>
Exécutez la commande ng g c components/homepour générer le composant home. Remplacez le contenu de home.component.htmlpar:
<input type="text" placeholder="Enter message" #message>
<button type="button" (click)="setMessage(message)" >Send message</button>
#messageest la variable locale ici. Ajoutez une propriété message: string;
à la app.component.tsclasse de.
Exécutez cette commande ng g s service/message. Cela va générer un service à src\app\service\message.service.ts. Fournir ce service à l'application .
Importer Subjectdans MessageService. Ajoutez également un sujet. Le code final doit ressembler à ceci:
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
}
}
Maintenant, injectez ce service home.component.tset passez-en une instance au constructeur. Faites cela app.component.tsaussi. Utilisez cette instance de service pour transmettre la valeur de #messageà la fonction de service 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);
}
}
À l'intérieur app.component.ts, abonnez-vous et désabonnez-vous (pour éviter les fuites de mémoire) à 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();
}
}
C'est ça.
Maintenant, toute valeur entrée à l'intérieur #messagede home.component.htmldoit être imprimée à l' {{message}}intérieurapp.component.html