/ / Angular2 Dostęp do pierwszego elementu w Observable of array - angular, rxjs, obserwable

Angular2 Dostęp do pierwszego elementu w Observable of array - angular, rxjs, obserwowalny

EDYCJA: W końcu mój problem poszedł na marne https://plnkr.co/edit/A2WipJwW9kEhhlh90xMj. Jeśli trafisz na wybrany rynek, a następnie naciśnij enter, wejdzie on w marketSelectorDropDown Metoda w pliku market-search.component.ts. Problem występuje w kilku wierszach pod mapą i subskrypcja nigdy nie jest wykonywana, dopóki menu rozwijane wybranego rynku nie zostanie kliknięte ponownie. Nie rozumiem dlaczego. Każda pomoc jest mile widziana!

this.markets
.map(markets => {
debugger
if(markets && markets.length > 0) return markets[0];
})
.subscribe((market: Market) => {
debugger
this.pick(market.name)
});

EDYCJA: W komentarzach tego oznaczonego jako odpowiedź jest odpowiedzią. Należy użyć BehaviorSubject. Dzięki temu spóźnieni subskrybenci mogą otrzymać ostatnie zdarzenie.

Odpowiedzi:

3 dla odpowiedzi № 1

Zgodnie z dokumentacją RxJS5

Pierwszy operator

Jeśli wywoływany bez argumentów, najpierw emitujepierwsza wartość źródła Obserwowalne, a następnie kończy się. Najpierw wywoływane z funkcją predykatu emituje pierwszą wartość źródła, która odpowiada podanemu stan. Wytworzenie pliku może również wymagać funkcji wynikowej Selektor wartość wyjściowa z wartości wejściowej i defaultValue do wysłania w przypadku źródło kończy się, zanim będzie w stanie wyemitować prawidłową wartość. Rzuty błąd, jeśli nie podano defaultValue, a pasującym elementem jest nie znaleziono.

Jest to przydatne, jeśli masz do czynienia z Observable from event

Na przykład emituj tylko pierwsze kliknięcie, które ma miejsce w DOM (np .one w jQuery)

var clicks = Rx.Observable.fromEvent(document, "click");
var result = clicks.first();
result.subscribe(x => console.log(x));

Lub możesz spojrzeć na inny przypadek użycia w tej odpowiedzi Angular 2 runOutsideAngular nadal zmienia interfejs użytkownika

Nie jest to dokładnie to, czego chcesz, ale możesz użyć tego w następujący sposób:

.first(null, arr => arr[0]).subscribe...

i powinien zwrócić pożądany pierwszy element tablicy Przykład Plunkera(pierwszy)

Ale wykorzystałbym map operator zrobić to samo:

.map(arr => arr[0]).subscribe...

Przykład Plunkera(mapa)


0 dla odpowiedzi nr 2

Twój przykład nie działa, ponieważ używasz CDN dla RxJS 2, do tego potrzebujesz RxJS 5. Próbowałem zastąpić CDN do wersji 5 i działało dobrze.