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 № 1Zgodnie 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.