2016-07-08 59 views
12

Attualmente sto lavorando a un progetto con Angular 2 e angularFire2. mio database appare così in Firebase: Base:/datiEstrazione dei dati dall'oggetto Firebase con Angular2, angularfire2 e Typescript

[{Name:test1}, 
{Name:test2}, 
{Name:test3}] 

Tutti gli elementi hanno anche la chiave Firebase.

Ora sto cercando di ottenere dati dal Firebase con Observabels da RX. Quando faccio questo, ottengo i nomi nella console:

let items= af.database.list('/data').map(i=>{return i}); 
items.forEach(i=>i.forEach(e=>(console.log(e.name)))); 

uscita: test1, test2, test3. Tutto funziona.

Ma quando faccio questo:

console.log(items.first()); 

ottengo un FirebaseListObservable indietro.

Come posso ottenere solo il Primo oggetto da FirebaseListObservable? Come posso modificare gli articoli nell'elenco? come:

items[0].name=test3 

e come posso ottenere la chiave Firebase da un elemento

come posso ottenere il firebaseKey da un elemento nell'elenco?

risposta

16

Observables sono una struttura dati asincrono, il che significa che in realtà non so quando i dati sta per essere disponibile, è necessario iscriversi al Observable e attendere che i dati saranno disponibili nel gestore next.

items.first().subscribe(x => console.log(x.name)); 

Inoltre, un Observable non è statica, quindi non è possibile indicizzare come tale. Se è necessario solo il primo elemento, suggerirei invece di estrarre il valore e modificarlo con una combinazione flatMap + first + map.

af.database.list('/data') 
    //Convert array into Observable and flatten it 
    .flatMap(list => list) 
    //Get only the first item in this list 
    .first() 
    //Transform the value 
    .map(({name, firebaseKey}) => ({name: "test3", firebaseKey})) 
    //Subscribe to the stream 
    .subscribe(x => console.log(x)); 
+1

GRAZIE, questo mi ha davvero aiutato. – jufabeck2202

+0

Sei il benvenuto! – paulpdaniels

+0

Cosa fare se si desidera eseguire il loop sugli elementi anziché solo sul primo? – Lloyd