2013-03-01 1 views
9

Per esempio, ho seguito la struttura del database:Come dire che i discendenti sono cambiato con il ("child_changed")

/ 
+ users 
    + 1 
    + items 
     + -xxx: "hello" 
    + 2 
    + items 

Poi;

var usersRef = new Firebase("https://mydb.firebaseio.com/users"); 
usersRef.on("child_changed", function(snapshot) { 
    utils.debug(JSON.stringify(snapshot.exportVal())); 
}); 

Se un valore, "mondo", è spinto a "/ utenti/1/articoli", io possa avere:

{"items": {"-xxx": "hello", "-yyy": "world"}} 

Quindi, come per dire che uno è cambiato?

Devo attivare ("child_added") ogni singolo riferimento a "/ users/$ id/items"?

NOTA: sto provando a scrivere un processo di amministrazione in node.js.

+0

Il tuo "I may get" non corrisponde alla struttura che hai mostrato sopra; hai '" items ": {" 1 ": {" items "', inoltre, non puoi ottenere quel risultato ascoltando/users per 'child_changed'; si otterrebbe qualcosa di simile a questo: '{" items: {....}} ' – Kato

+0

Ho corretto cosa posso ottenere., grazie – hiroshi

risposta

22

L'evento child_changed fornisce solo informazioni su quale bambino immediato è stato modificato. Se un nodo più profondo in una struttura dati è cambiato, saprai quale figlio immediato è stato interessato ma non il percorso completo dei dati modificati. Questo è di design.

Se si desiderano aggiornamenti granulari su esattamente ciò che è stato modificato, è necessario associare ricorsivamente i callback a tutti gli elementi che si interessano. In questo modo, quando un elemento cambia, saprai qual è l'elemento in base al quale viene attivato il callback. Firebase è effettivamente ottimizzato per questo caso d'uso; collegare un numero elevato di callback, anche migliaia, dovrebbe funzionare correttamente. Dietro le quinte, Firebase aggrega tutte le callback insieme e sincronizza solo il set minimo di dati necessari.

Quindi, per il tuo esempio, se si desidera ottenere avvisati ogni volta che un nuovo elemento viene aggiunto per qualsiasi utente, è possibile effettuare le seguenti operazioni:

var usersRef = new Firebase("https://mydb.firebaseio.com/users"); 
usersRef.on("child_added", function(userSnapshot) { 
    userSnapshot.ref().child("items").on("child_added", function(itemSnapshot) 
    utils.debug(itemSnapshot.val()); 
    }); 
}); 

Se si lavora con un numero molto elevato di utenti (centinaia di migliaia o milioni) e la sincronizzazione di tutti i dati è poco pratica, c'è un altro approccio. Piuttosto che fare in modo che il tuo server ascolti tutti i dati direttamente, puoi farlo ascoltare una coda di modifiche. Quindi, quando i client aggiungono articoli ai loro elenchi di articoli, potrebbero anche aggiungere un articolo a questa coda in modo che il server ne venga a conoscenza.

Questo è ciò che il codice del client potrebbe essere simile:.

var itemRef = new Firebase("https://mydb.firebaseio.com/users/MYID/items"); 
var serverEventQueue = new Firebase("https://mydb.firebaseio.com/serverEvents"); 
itemRef.push(newItem); 
serverEventQueue.push(newItem); 

Si potrebbe quindi avere il server in ascolto per child_added su quella coda e gestire gli eventi quando entrano in

+0

Grazie Andrew, ho avuto un'idea di come funziona il gestore' on() ' Vado per il primo approccio per ora, e potrei usare il secondo per un'occasione – hiroshi

+1

Attenzione! Ora dovresti usare 'userSnapshot.ref' invece di' userSnapshot.ref() ' – MasterScrat

+0

Grazie Andrew, penso che questo è la direzione che ho bisogno di andare e questo post è molto utile – Lucy

4

Andrew Lee ha dato un bella risposta, ma penso che dovresti provare a usare le funzioni cloud. qualcosa del genere dovrebbe funzionare:

+0

Grazie anche a Yernar. Passerò alle funzioni cloud nel prossimo futuro e aggiornerò qui se avrò successo Il jolly è solo la potenza di cui ho bisogno. – Lucy

+0

@Yernar, la struttura "ref ('/ users/{id}/items/{itemId}')" funziona per l'API di riferimento del database? (ovvero, le funzioni non cloud api) – bernatfortet

+0

@bernatfortet, non credo, perché questo è il punto delle funzioni cloud. hanno caratteristiche che è possibile utilizzare sul proprio back-end. –