typescript - Angular - Uppdatera komponentvärde när tjänstevärde ändras


Jag har flera komponenter (i en NgFor-loop) som anropar samma tjänst.

Vad jag skulle vilja är att när en komponent ändrar ett värde i samma tjänst, så skickas det nya värdet sedan till varje komponent som anropar den tjänsten och uppdaterar i förlängningen det värdet i en komponentvariabel.

Jag hoppas att det är vettigt.

Om du behöver mer information, vänligen meddela mig.

Svar #1

Istället för en BehaviorSubject (vilket ofta är överdrivet i enkla scenarier), kan du använda enkla getters:

Tjänsten har viss data att dela:

export class ProductParameterService {
  showImage: boolean;
  filterBy: string;

  constructor() { }

}

Komponenter använder bara en getter och alla mallvariabler som är bundna till egenskapen uppdateras automatiskt när tjänstevärdet ändras:

get showImage(): boolean {
    return this.productParameterService.showImage;
}

I mallen:

                        <img *ngIf='showImage'
                             [src]='product.imageUrl'
                             [title]='product.productName'>

Om någon komponent någonstans i applikationen använder tjänsten för att ändra värdet på showImage, kommer vyn automatiskt att uppdateras (genom att utnyttja Angulas inbyggda förändringsdetektion).

Svar #2

Skapa bara en SharedService så här:

import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';

@Injectable()
export class SharedService {

  private sharedData: BehaviorSubject<any> = new BehaviorSubject<any>(null);
  sharedData$: Observable<any> = this.sharedData.asObservable();

  setSharedData(sharedData) {
    this.sharedData.next(sharedData);
  }

}

Denna tjänst kan sedan injiceras i de komponenter där du vill dela datan.

För att sätta datan, anropa setSharedData. För att få de senaste ändringarna på sharedData, prenumerera på sharedData$ Observable direkt i komponentens ngOnInit.