слияние наблюдаемых не получает значение второго наблюдаемого - PullRequest
0 голосов
/ 06 мая 2020

У меня небольшая проблема с этим кодом:

import { Injectable } from '@angular/core';
import { BehaviorSubject, Subject, merge } from 'rxjs';
import { scan, map } from 'rxjs/operators';
import { boatsList } from 'src/app/shared/mocks/boats.mock';
import { CatamaranModel } from 'src/app/shared/models/catamaran.model';
import { SailBoatModel } from 'src/app/shared/models/sail-boat.model';

@Injectable({
  providedIn: 'root'
})

export class BoatListService {

  private boatListInitSubject: BehaviorSubject<(CatamaranModel|SailBoatModel)[]> = new BehaviorSubject(boatsList);
  boatListInit$ = this.boatListInitSubject.asObservable();

  private addedBoatSubject: Subject<(CatamaranModel|SailBoatModel)> = new Subject();
  addedBoat$ = this.addedBoatSubject.asObservable();

  boatList$ = merge(
    this.boatListInit$,
    this.addedBoat$
  )
    .pipe(
      scan((acc: (CatamaranModel|SailBoatModel)[], value: CatamaranModel|SailBoatModel) => [...acc, value])
    );

  constructor() {
  }

  addBoat(boat: CatamaranModel | SailBoatModel){
    this.addedBoatSubject.next(boat);
  }
}

Проблема в моем слиянии

 boatList$ = merge(
    this.boatListInit$,
    this.addedBoat$
  )
    .pipe(
      scan((acc: (CatamaranModel|SailBoatModel)[], value: CatamaranModel|SailBoatModel) => [...acc, value])
    );

Я использую это слияние, чтобы иметь новый объект в моей коллекции, но объект в addedBoat $ никогда не добавляется в список, и я не знаю почему. Когда я делаю карту вместо сканирования, я не нахожу результат this.addedBoat $.

Если я подписываюсь на this.addedBoat $ и запускаю функцию addBoat, у меня есть хороший объект.

Могу ли я неправильно использовать слияние?

Ответы [ 2 ]

0 голосов
/ 20 мая 2020

Попробуйте изменить эту строку

private addedBoatSubject: Subject <(CatamaranModel | SailBoatModel)> = new Subject ();

на

private addedBoatSubject: BehaviourSubject <(CatamaranModel | SailBoatModel)> = new BehaviourSubject (желаемое значение);

0 голосов
/ 06 мая 2020

в этом сценарии вы должны использовать combLatest ..... измените свой вызов соответствующим образом:

import { combineLatest} from 'rxjs';

boatList$ = combineLatest(
    this.boatListInit$,
    this.addedBoat$
  )
    .pipe(
      scan((acc: (CatamaranModel|SailBoatModel)[], value: CatamaranModel|SailBoatModel) => [...acc, value])
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...