Как я могу получить одну наблюдаемую из нескольких наблюдаемых в этом сценарии? - PullRequest
1 голос
/ 22 января 2020

Вот моя ситуация. У меня есть форма, которая охватывает несколько вкладок и содержит два значения, numberOfUsers, которое является числом, и users, которое является массивом пользовательских данных (идентификатор, имя, адрес, город).

Каждое tab создается динамически и имеет повторяющуюся группу form с именем 'user', которая является частью formArray. Каждая вкладка может содержать не более 3 групп пользователей.

Я хотел бы обновить массив основной формы users, указав значения всех созданных групп пользователей. Прямо сейчас у меня есть разные формы на каждой вкладке, содержащие разные пользовательские данные. Я использую динамический c BehaviorSubject в сервисе для сбора и передачи данных из вторичных форм. Вот сервис:

export class BroadcasterService {

    // subject 
    protected _eventsSubject = new BehaviorSubject<any>({});
      constructor() {
      }
    broadcast(key: any, value: any) {
        this._eventsSubject.next({ key, value }); // here we are setting the key and value of our subject
    }

    on<T>(key: any): Observable<T> {
        return this._eventsSubject.asObservable()
            .pipe(

                filter(e => e.key === key),
                map(e => e.value)
            );
    }

Каждая форма устанавливает свой key и передает value в behaviorSubject следующим образом:

 onChanges(): void {
       this.usersArray.valueChanges
            .subscribe(val => {
                this.broadcaster.broadcast('BIS_' + this.tabNumber, val);
            }); 

    }

Затем в моем основном компоненте, Я подписываюсь на все наблюдаемые и предполагаю, что мне нужно объединить или объединить их или сделать что-то еще, чтобы получить одну наблюдаемую, которая обновляет users formArray в моей основной форме. Вот что я делаю:

  let main: Observable<[]> = this.broadcaster.on("Main");
  let bis1: Observable<[]> = this.broadcaster.on("BIS_1");
  let bis2: Observable<[]> = this.broadcaster.on("BIS_2");

  Observable.concat(main, bis1, bis2).subscribe(values => {

                                              values.forEach(value => {

                                                        this.addUser();
                                              });

                                              this.usersArray.patchValue( values );

  });

Видимо, я делаю что-то очень неправильно. Я новичок в RX js. Я даже не знаю, является ли этот подход правильным ... Я получаю несколько подписок с нулевыми значениями и, в зависимости от порядка наблюдаемых в объединенной наблюдаемой, я получаю разные результаты. Может ли кто-нибудь помочь мне в этом ...?

Вот блиц, для лучшего понимания.

https://stackblitz.com/edit/bis-tabs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...