перезагрузить список в компоненте, когда тема меняется в службе Angular 10

Я хочу перезагружать список в моем component, когда в него вносятся изменения. Этот список хранится в service как BehaviourSubject. Я подписываюсь на тему в своем компоненте, который отображает список в таблице. Когда пользователь щелкает элемент в списке, он открывает представление через router. Здесь пользователь может выполнять некоторые действия с этим элементом (удалить, отредактировать/сохранить и т. д.), но когда элемент удаляется, он удаляет его в исходном списке в service, но по-прежнему показывает этот элемент в компоненте, где отображается список. Я думал, что тема поведения будет проверена, если будут внесены изменения, и перезагрузит список, но это, похоже, не работает.

my service.ts:

export class OfferService {
  offers: Offer[] = [];
  public offersSubject = new BehaviorSubject<Offer[]>(this.offers);

  constructor(private http: HttpClient) {
    this.generateRandomOffers();
   }

  private generateRandomOffers(): void {

    for (let i = 0; i < 8; i++) {
      let offer = new Offer(this.offersSubject.getValue().length + 1);
      offer = Offer.createRandomOffer();
      this.offersSubject.getValue().push(offer);
    }

  }

  public FindAll(): Offer[] {
    return this.offersSubject.getValue();
  }

  // observable of offers list
  public getAll(): Observable<Offer[]> {
    return of(this.offersSubject.getValue());
  }


  public FindById(offerId: number): Offer {
    return this.offersSubject.getValue().find(o => o.id === offerId);
  }

  public Save(offer: Offer): Offer {
    let offerExist = false;
    const index = this.offersSubject.getValue().findIndex(o => o.id === offer.id);

    this.offersSubject.getValue().forEach( element => {
      if (element.id === offer.id)
      {
        element = offer;
        offerExist = true;
        this.offersSubject.getValue()[index] = element;
      }
    });

    if (!offerExist)
    {
      this.offersSubject.getValue().push(offer);
    }
    return this.offersSubject.getValue().find(o => o.id === offer.id);
  }

  public DeleteById(offerId: number): Offer {
    const deleteOffer = this.offersSubject.getValue().find(o => o.id === offerId);
    this.offers = this.offersSubject.getValue().filter(o => o.id !== offerId);
    this.offersSubject.next(this.offers);
    return deleteOffer;
  }

  public AddOffer(): void {
    let offer = new Offer(this.offers.length + 1);
    offer = Offer.createRandomOffer();
    this.offersSubject.getValue().push(offer);
  }
}

Мой Component.ts (где отображается список):

selectOfferViaRouter = false;
  offers: Offer[] = [];
  selectedOfferId = -1;
  trigger: any;

  constructor(
    private offerService: OfferService,
    private router: Router,
    private activatedRoute: ActivatedRoute) { }

  ngOnInit(): void {
    this.getAllOffers();
  }

  ngOnChanges(): void {
    this.getAllOffers();
  }

  // get all offers on observable
  getAllOffers(): void {
    this.offerService.getAll().subscribe(data => {
      this.offers = data;
    });
  }

  // to update the table of offers
  detectTrigger(event: Event): void {
    this.getAllOffers();
    console.log(this.offers);
  }

  selectOffer(id: number): void {
    this.router.navigate([id], {relativeTo: this.activatedRoute});
  }


  addOffer(): void{
    this.offerService.AddOffer();
  }

person Ronny Giezen    schedule 09.11.2020    source источник


Ответы (1)


Чтобы постоянно получать данные из потока, вам необходимо предоставить одну и ту же ссылку. В сервисном методе getOffer вам нужно вернуть this.offersSubject.asObservable(); Это часть того же потока, доступная только для чтения. Когда вы хотите обновить поток, вы вызываете следующий исходный поток. Я уже создал простую демонстрацию! :)

person ravciok    schedule 10.11.2020
comment
Спасибо за большую помощь, я исправил это в своем приложении, спасибо. Демонстрация заставила меня действительно понять это! - person Ronny Giezen; 11.11.2020