Hola, este es mi ejemplo de código js de proyecto simple
const deleteOneNote = (id) => { const db = openNoteDb(); db.notes.where('id').equals(id).delete(); } $(document).on("click", ".remove_note", function () { const id = $(this).parent().parent().attr("id"); const db = openNoteDb(); db.notes.where('id').above(-1).modify(result => { if (result.id == id) { deleteOneNote(result.id); window.location.reload(true) } }) })Pero mi función de eliminación no funciona. No entiendo. Por favor, ayúdame.
En primer lugar, su función deleteOneNote() debe devolver la promesa de db.transaction() para que pueda esperar a que se complete la eliminación. Alternativamente, haga que la función sea asíncrona y espere la promesa devuelta por db.transaction(). Independientemente de lo que elija, la persona que llama a su función también debe esperar su función antes de probar si la eliminación fue exitosa o no.
Luego, también veo un problema común en el código, que es que la instancia de Dexie se crea bajo demanda, lo que provocaría una pérdida de memoria a menos que la cierre cuando termine. En su lugar, declare db en el nivel superior para que viva durante toda la vida útil de su aplicación y permita que las funciones usen la misma instancia de db en todas partes.
Un tercer error común (que podría no ser esta causa) es que las personas proporcionen una cadena cuando la clave se almacenó como un número, o viceversa. Asegúrese de que la identificación proporcionada a su función sea del mismo tipo que en el objeto que desea eliminar.
// Declare one single Dexie instance in your entire application // and use it from all functions. const db = new Dexie("NotesDB"); // If you use modules, keep this code in a module and // add an 'export' before 'const db = new Dexie("NotesDB"); db.version(1).stores({ notes: ` id, time, note, noteBackColor, noteTextColor, projectType, alarm`, }); // Let you functions use the singleton Dexie instance: const deleteOneNote = (id) => { return db.transaction('rw', db.notes, function () { // Note: Doing this in a transaction is over-kill, but ok. return db.notes.delete(id); }).catch((err) => { console.log(err); throw err; // Also, you probably want to rethrow the error... }); }Ahora, estas son recomendaciones de código de la sección de mejores prácticas de Dexie y no necesariamente la razón por la cual su código no puede eliminar un elemento.
Una cosa más interesante es:
¿Cuál es el valor de la propiedad "id" en su base de datos del objeto que desea eliminar? Supongo que su objeto se parece a {id: "x", time: "y", ...} .
¿Qué argumento le pasas a tu función? Si el objeto que está eliminando se parece al descrito en la viñeta anterior, el valor del argumento id debe ser exactamente la cadena "x", no el objeto ni una matriz ni ningún otro tipo, una cadena con el valor exacto "x".
Una prueba de trabajo para este código sería:
const foo = {id: "x", time: "y"}; db.notes.put(foo).then(async () => { if (await db.notes.get("x")) { console.log("My object is there!"); } else { console.log("My object is not there!"); } console.log("Now deleting it..."); await deleteOneNote("x"); if (await db.notes.get("x")) { console.log("My object is there!"); } else { console.log("My object is not there!"); } }).catch(console.error);El resultado de ejecutar esta prueba debe ser:
My object is there! Now deleting it... My object is not there!