Usé aws-amplify durante muy poco tiempo para mi proyecto. Recientemente, me enfrenté a un problema grave sobre la actualización de datos en DataStore en aws-amplify. Después de leer los documentos de su sitio oficial, descubrí que, si quiero actualizar los datos en DataStore, funcionó de manera inmutable de esta manera,
Para la creación de datos,
await DataStore.save( new Post({ title: "My First Post", rating: 10, status: PostStatus.DRAFT }) );y para la actualización de datos,
const original = await DataStore.query(Post, "123"); await DataStore.save( Post.copyOf(original, updated => { updated.title = `Any Title`; }) );no hay problema con la creación, pero cuando voy con la actualización, esta línea es un problema si tiene más de 20 propiedades en su modelo de objeto. Porque tienes que escribir todas esas propiedades y actualizarlas.
updated.title = `Any Title`;Entonces, quiero actualizar así sin escribir todas las propiedades manualmente,
const updatedTestResult = { ...this.testResult, ...this.testResultForm.value }; var result = await DataStore.save(TestResult.copyOf(this.testResult, updatedTestResult))ahora me muestra este error,
TypeError: fn is not a function at datastore.js:376:17 at produce (immer.esm.js:1:16034) at Model.copyOf (datastore.js:375:32) at test-result-form.component.ts:130:41 at Generator.next (<anonymous>) at asyncGeneratorStep (asyncToGenerator.js:3:1) at _next (asyncToGenerator.js:25:1) at asyncToGenerator.js:32:1 at new ZoneAwarePromise (zone.js:1427:29) at asyncToGenerator.js:21:1o tal vez hay otra solución. ¿Puedes complacerme en eso?
Creo que la función copyOf toma 2 parámetros, el primero es el objeto y el segundo es la devolución de llamada. Entonces, puedes hacer algo como esto.
await DataStore.save( Post.copyOf(original, updated => { ...updated, ...this.testResultForm.value }) );Originalmente, esta pregunta se responde en la discusión de Github. Para actualizar una sola propiedad a la vez, puede hacer lo siguiente:
async function updateTestResult(key, value) { try { const testResult = await DataStore.save( TestResult.copyOf(originalTestResult, (updated) => { updated[key] = value; }) ); console.log("TestResult updated:", testResult); } catch (error) { console.error("Save failed:", error); } }Para actualizar varias propiedades a la vez, puede hacer lo siguiente:
async function updateTestResult(testResultForm) { try { const testResult = await DataStore.save( TestResult.copyOf(originalTestResult, (updated) => { for (const property in testResultForm) { updated[property] = testResultForm[property]; } }) ); console.log("TestResult updated:", testResult); } catch (error) { console.error("Save failed:", error); } }si desea ver la respuesta original, consulte este enlace: https://github.com/aws-amplify/amplify-js/discussions/9984#discussioncomment-2959980