Un observable le permite suscribirse solo mientras que un sujeto permite publicar y suscribirse.
Por lo tanto, un tema permite que sus servicios se utilicen como editor y como suscriptor.
A partir de ahora, no soy tan bueno, Observable
así que compartiré solo un ejemplo de Subject
.
Comprendamos mejor con un ejemplo de CLI angular . Ejecute los siguientes comandos:
npm install -g @angular/cli
ng new angular2-subject
cd angular2-subject
ng serve
Reemplace el contenido de app.component.html
con:
<div *ngIf="message">
{{message}}
</div>
<app-home>
</app-home>
Ejecute el comando ng g c components/home
para generar el componente de inicio. Reemplace el contenido de home.component.html
con:
<input type="text" placeholder="Enter message" #message>
<button type="button" (click)="setMessage(message)" >Send message</button>
#message
es la variable local aquí. Agregue una propiedad message: string;
a la app.component.ts
clase 's.
Ejecute este comando ng g s service/message
. Esto generará un servicio en src\app\service\message.service.ts
. Proporcionar este servicio a la aplicación. .
Importar Subject
a MessageService
. Agrega un tema también. El código final se verá así:
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
}
}
Ahora, inyecte este servicio home.component.ts
y pase una instancia del mismo al constructor. Haz esto por app.component.ts
también. Use esta instancia de servicio para pasar el valor de #message
a la función de servicio 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);
}
}
En el interior app.component.ts
, suscríbase y anule la suscripción (para evitar pérdidas de 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();
}
}
Eso es.
Ahora, cualquier valor ingresado dentro #message
de home.component.html
se imprimirá {{message}}
dentroapp.component.html