我在我的项目中使用了很短时间的aws-amplify。最近,我遇到了一个严重的问题,即在aws-amplify中DataStore中的数据更新。在阅读了他们官方网站的文档后,我发现,如果我想在DataStore中更新数据,它以不可变的方式工作,就像这样,
创建数据,
await DataStore.save(
new Post({
title: "My First Post",
rating: 10,
status: PostStatus.DRAFT
})
);
和更新数据
const original = await DataStore.query(Post, "123");
await DataStore.save(
Post.copyOf(original, updated => {
updated.title = `Any Title`;
})
);
创建没有问题,但是当我使用更新时,如果您的对象模型中有超过20个属性,这一行就很痛苦。因为你需要写这些属性然后更新。
updated.title = `Any Title`;
我想这样更新而不需要手动写入所有属性,
const updatedTestResult = { ...this.testResult, ...this.testResultForm.value };
var result = await DataStore.save(TestResult.copyOf(this.testResult, updatedTestResult))
现在显示了这个错误,
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:1
或者可能有其他解决方案。你能告诉我这个吗?
- TIA
我相信,copyOf函数有2个参数,第一个是对象,第二个是回调。因此,你可以这样做
await DataStore.save(
Post.copyOf(original, updated => {
...updated, ...this.testResultForm.value
})
);
最初这个问题是在Github讨论中回答的。对于一次更新单个属性,您可以执行以下操作:
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);
}
}
要一次更新多个属性,您可以这样做:
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);
}
}
如果你想看原始an下水道检查这个链接:https://github.com/aws-amplify/amplify-js/discussions/9984#discussioncomment-2959980