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 Observable
ce 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.html
par:
<div *ngIf="message">
{{message}}
</div>
<app-home>
</app-home>
Exécutez la commande ng g c components/home
pour générer le composant home. Remplacez le contenu de home.component.html
par:
<input type="text" placeholder="Enter message" #message>
<button type="button" (click)="setMessage(message)" >Send message</button>
#message
est la variable locale ici. Ajoutez une propriété message: string;
à la app.component.ts
classe 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 Subject
dans 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.ts
et passez-en une instance au constructeur. Faites cela app.component.ts
aussi. 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 #message
de home.component.html
doit être imprimée à l' {{message}}
intérieurapp.component.html