javascript - react native firebase redux
Firebase child_added solo para nuevos artÃculos (4)
Aunque el método de límite es bastante bueno y eficiente, aún debe agregar un cheque a child_added
para el último elemento que se child_added
. Además, no sé si sigue siendo el caso, pero es posible que obtenga eventos "antiguos" de elementos eliminados anteriormente, por lo que es posible que deba verlos también.
Otras soluciones serían a:
Utilice un valor booleano que impida que los objetos antiguos agregados llamen a la devolución de llamada
let newItems = false
firebaseDb.child(''invites'').on(''child_added'', snapshot => {
if (!newItems) { return }
// do
})
firebaseDb.child(''invites'').once(''value'', () => {
newItems = true
})
La desventaja de este método es que implicaría obtener eventos que no harán nada, pero si tiene una lista inicial grande puede ser problemático.
O si tiene una marca de tiempo en sus invitaciones, haga algo como
firebaseDb.child(''invites'')
.orderByChild(''timestamp'')
.startAt(Date.now())
.on(''child_added'', snapshot => {
// do
})
Estoy usando Firebase y Node con Redux. Estoy cargando todos los objetos de una clave de la siguiente manera.
firebaseDb.child(''invites'').on(''child_added'', snapshot => {
})
La idea detrás de este método es que obtenemos una carga útil de la base de datos y solo usamos una acción para actualizar mis almacenes de datos locales a través de los Reductores.
A continuación, necesito escuchar a cualquier hijo NUEVO o ACTUALIZADO de la invitación clave. Sin embargo, el problema ahora es que el evento child_added se desencadena para todas las claves existentes, así como para las recién agregadas. No quiero este comportamiento, solo necesito nuevas claves, ya que tengo los datos existentes recuperados.
Soy consciente de que child_added se usa normalmente para este tipo de operación, sin embargo, deseo reducir el número de acciones que se activan y, como resultado, las activaciones se activan.
¿Cuál sería el mejor patrón para lograr este objetivo?
Gracias,
He resuelto el problema usando el siguiente método.
firebaseDb.child(''invites'').limitToLast(1).on(''child_added'', cb)
firebaseDb.child(''invites'').on(''child_changed'', cb)
limitToLast (1) obtiene el último objeto secundario de invitaciones y, a continuación, escucha las nuevas, pasando un objeto de instantánea a la devolución de llamada de CB.
child_changed escucha cualquier actualización secundaria a invitaciones, pasando una instantánea a la cb
También había otra solución: obtener el número de hijos y extraer ese valor: y está funcionando.
var ref = firebaseDb.child(''invites'')
ref.once(''value'').then((dataSnapshot) => {
return dataSnapshot.numChildren()
}).then((count) =>{
ref .on(''child_added'', (child) => {
if(count>0){
count--
return
}
console.log("child really added")
});
});
child_added
esto ignorando child_added
todos juntos y usando solo child_changed
. La forma en que lo hice fue realizar una update()
en los elementos que necesitaba manejar después de insertarlos en la base de datos. Esta solución dependerá de sus necesidades, pero un ejemplo es actualizar una clave de marca de tiempo siempre que desee que se active el evento. Por ejemplo:
var newObj = { ... }
// push the new item with no events
fb.push(newObj)
// update a timestamp key on the item to trigger child_changed
fb.update({ updated: yourTimeStamp })