• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

209
Views
Cambiar el valor observable en un componente no activa la suscripción en un servicio

Tengo un escenario en el que envío datos de un componente a un servicio que luego manipula los datos. La idea era que cuando obtengo datos en el componente, inserto el cambio en una variable BehaviorSubject usando next .

Por alguna razón desconocida para mí, this.person.subscribe() no se activa al pasar el valor usando next . Sin embargo, cuando compruebo si se cambió el valor en el servicio, veo que se actualizó correctamente.

Componente

 constructor(private incomeService: IncomeService) { } ngOnInit(): void { // Fetching data from a service this.person = fetchedTestData; // This doesn't trigger subscribe method in the service this.incomeService.person.next(fetchedTestData); // The data is definitely changed because the value is correctly set console.log(this.incomeService.person) }

Servicio

 person: BehaviorSubject<any> = new BehaviorSubject<any>(null); constructor() { this.person.subscribe(person => { // Do something else }); }

¿Cuál parece ser el culpable aquí?

about 3 years ago · Santiago Trujillo
3 answers
Answer question

0

En general, los servicios de Angular están destinados a manejar la recuperación de datos y toda la lógica comercial, mientras que los componentes se suscriben a Observables para fines de visualización.

Si entiendo tu situación correctamente, sería mejor que hicieras algo como esto:

Servicio

 public person$$ = new BehaviorSubject<unknown>(null); public person$ = this.person$$.asObservable(); public getPerson(): void { // logic for retrieving data this.person$$.next(response); }

Componente

 public person$ = this.incomeService.person$; // if you wanted to use console for debugging you could also add // .pipe(tap(person => console.log(person))) // which would log to console whenever the person$$ subject is updated in the service constructor(private incomeService: IncomeService) {} ngOnInit(): void { this.incomeService.getPerson(); }

Modelo

 <ng-container *ngIf="person$ | async as person"> {{ person | json }} </ng-container>

En este caso, debido a que la canalización async se usa en la plantilla, maneja automáticamente la suscripción (y la cancelación de la suscripción cuando se destruye el componente). También puede .subscribe en la lógica del componente, solo asegúrese de tener una llamada para cancelar la unsubscribe en algún lugar para evitar pérdidas de memoria.

about 3 years ago · Santiago Trujillo Report

0

En el servicio tienes a la person como sujeto de conducta. Lo actualizaría allí, no en su componente.

componente

 this.incomeService.updatePerson('something');

Servicio

 constructor() { this.person.subscribe(person => { console.log(person); }); } updatePerson(arg:string){ console.log('is this happening?', arg); this.person.next(arg); }
about 3 years ago · Santiago Trujillo Report

0

El problema estaba en una función que estaba generando un error y que se ejecuta antes de llamar a next . Desafortunadamente me lo perdí porque los errores en mi consola de Google Chrome estaban ocultos.

Entonces, como recordatorio para cualquier otra persona que tenga un problema similar; verifique que sus métodos se ejecuten sin errores antes de entrar en pánico.

about 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error