Наблюдаемый массив, найти индекс значения - PullRequest
0 голосов
/ 30 апреля 2018

Я пишу приложение Angular, которое получает список магазинов из сервиса в качестве наблюдаемого.

Когда пользователь щелкает маркер на карте, я хочу получить индекс магазина в массиве, который находится внутри Observable.

stores: Observable<Store[]>;

ngOnInit() {
    this.stores = http.get<Store[]>('URL');
}

onMarkerClick(event) {
   const geopoint = event.geopoint;
   //How can I get the index where store.geopoint === event.geopoint?
}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Если вы хотите лениво получить store[] из своего бэкэнда, вам придется получить их при первой подписке на this.stores. Все остальные подписчики могут использовать те же значения, которые возвращены вашим http.get. Для этого мы можем использовать .shareReplay() для многоадресной рассылки всех подписчиков на один и тот же источник и заставить его воспроизводить свои предыдущие значения вместо повторного вызова http.get

function getStores() {
  //return http.get<Store[]>(URL) 
  return Rx.Observable.from(['asdf', 'foo', 'bar']).delay(500);
}

const stores = getStores()
  .do(undefined, undefined, _ => console.log('retrieved values from http backend'))
  .shareReplay();
const $buttonClicks = Rx.Observable.fromEvent(document.getElementById('button'), 'click');

$buttonClicks
  .do(_ => console.log('CLICKED'))
  .switchMap(_ => stores
               .map((val, idx) => [val, idx])
               .filter(tuple => tuple[0] === 'foo')
               .map(tuple => tuple[1])
            )
  .subscribe(
    idx => console.log('got index of `foo`: ' + idx)
  );

SwitchMap немного уродлив (map / filter / map), потому что в этом примере кода используется не массив, а отдельные выбросы. .toArray() может это исправить. Зависит от того, как вы хотите использовать индекс (или значение)

0 голосов
/ 30 апреля 2018

Для фильтрации хранилищ из массива вы делаете:

this.storesCollection.filter(store => store.geopoint === event.geopoint); // -1 if not found

А для преобразования Observable в Array используйте карту:

this.stores$.map((stores: Stores[]) => this.storesCollection = stores)

Вам не нужно делать подписку (), потому что http возвращает горячую наблюдаемую, всегда срабатывает независимо от того, есть подписчик или нет

...