Um observável permite que você se inscreva apenas, enquanto um assunto permite que você publique e se inscreva.
Portanto, um assunto permite que seus serviços sejam usados tanto como publicador quanto como assinante.
A partir de agora, eu não sou tão bom Observable
assim, vou compartilhar apenas um exemplo de Subject
.
Vamos entender melhor com um exemplo de CLI Angular . Execute os comandos abaixo:
npm install -g @angular/cli
ng new angular2-subject
cd angular2-subject
ng serve
Substitua o conteúdo de app.component.html
por:
<div *ngIf="message">
{{message}}
</div>
<app-home>
</app-home>
Execute o comando ng g c components/home
para gerar o componente inicial. Substitua o conteúdo de home.component.html
por:
<input type="text" placeholder="Enter message" #message>
<button type="button" (click)="setMessage(message)" >Send message</button>
#message
é a variável local aqui. Adicione uma propriedade message: string;
à app.component.ts
classe de.
Execute este comando ng g s service/message
. Isso irá gerar um serviço em src\app\service\message.service.ts
. Forneça este serviço ao aplicativo .
Importar Subject
para MessageService
. Adicione um assunto também. O código final deve ficar assim:
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
}
}
Agora, injete esse serviço home.component.ts
e passe uma instância para o construtor. Faça isso app.component.ts
também. Use esta instância de serviço para passar o valor de #message
para a função de serviço 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);
}
}
Por dentro app.component.ts
, inscreva-se e cancele-a (para evitar vazamentos de memória) no 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();
}
}
É isso aí.
Agora, qualquer valor inserido dentro #message
de home.component.html
deve ser impresso em {{message}}
dentroapp.component.html