EDIT: Eu finalmente tenho o meu problema em uma jogada em https://plnkr.co/edit/A2WipJwW9kEhhlh90xMj. Se você atingir o mercado selecionado, pressione enter e ele entrará no marketSelectorDropDown
no arquivo market-search.component.ts. O problema está nas poucas linhas abaixo do mapa e a assinatura nunca é executada até que o menu suspenso do mercado selecionado seja clicado novamente. Eu não entendo o porquê. Qualquer ajuda é muito apreciada!
this.markets
.map(markets => {
debugger
if(markets && markets.length > 0) return markets[0];
})
.subscribe((market: Market) => {
debugger
this.pick(market.name)
});
EDIT: Nos comentários daquele marcado como a resposta é a resposta. É para usar um BehaviorSubject. Isso permite que os assinantes atrasados recebam o último evento enviado.
Respostas:
3 para resposta № 1De acordo com a documentação do RxJS5
Primeiro operador
Se chamado sem argumentos, emite primeiro oprimeiro valor da fonte Observável, em seguida, é concluído. Se chamado com uma função predicada, primeiro emite o primeiro valor da fonte que corresponde ao especificado condição. Também pode ser necessária uma função resultSelector para produzir o valor de saída do valor de entrada e um valor padrão para emitir caso a fonte é concluída antes de poder emitir um valor válido. Lança um erro se defaultValue não foi fornecido e um elemento correspondente for não encontrado.
É útil se você lida com o Observable do evento
Por exemplo, emita apenas o primeiro clique que acontece no DOM (como .one
em jQuery)
var clicks = Rx.Observable.fromEvent(document, "click");
var result = clicks.first();
result.subscribe(x => console.log(x));
Ou você pode procurar outro caso de uso nesta resposta O angular 2 runOutsideAngular ainda altera a interface do usuário
Portanto, não é exatamente isso que você deseja, mas você pode usá-lo assim:
.first(null, arr => arr[0]).subscribe...
e deve retornar o primeiro elemento desejado da matriz Exemplo de Plunker(primeiro)
Mas eu aproveitaria map
operador para fazer o mesmo:
.map(arr => arr[0]).subscribe...
Exemplo de Plunker(mapa)
0 para resposta № 2
Seu exemplo não funciona porque você está usando o CDN para o RxJS 2. Você precisa do RxJS 5 para isso. Tentei substituir o CDN para a versão 5 e estava funcionando muito bem.