У меня есть список объектов, динамически создаваемых пользователем. У каждого объекта есть наблюдаемая click$, я хочу объединить все эти click$ потоки в один поток.

Я пробовал статический оператор merge из импорта rxjs. С прямыми ссылками на поток:

sub = merge(list[0].click$, list[1].click$)
    .subscribe(e => { 
       console.log('My click event', e); 
    })

Все идет как положено.

Но когда я использую массив click$ в следующем вызове подписки, я получил объект Observable, а не событие щелчка.

const streams= [];
list.forEach(o => { streams.push(o.click$); });

sub = merge(streams).subscribe(e => {
  console.log(e); // e is an observable ???
});

Зачем? Что я делаю не так?

Вот аналогичная реализация с той же ошибкой: https://stackblitz.com /edit/typescript-ohq6rx?file=index.ts&devtoolsheight=100

0
EduBic 21 Ноя 2018 в 18:51

1 ответ

Лучший ответ

Поскольку это массив. Вы можете распространять массив с помощью оператора ... в JavaScript. Если вы сделаете это, все должно работать хорошо.

Дополнительную информацию можно найти на странице MDN.

Я добавил код, чтобы вы понимали, о чем я. Список - это массив объектов, у которых есть свойства click$. этот массив отображается только на click$, а затем распространяется с помощью оператора ....

sub = merge(...list.map(item => item.click$)).subscribe(console.log)

1
Murf 21 Ноя 2018 в 16:13