【问题标题】:How do I undo changed to an un-synced collection?如何撤消对未同步集合的更改?
【发布时间】:2016-03-28 09:33:49
【问题描述】:

如何撤消对数据库的未同步更改?

用例场景

我想让用户在他执行一项操作后至少几秒钟内撤消数据库操作(即删除)。

一种可能性是保留从数据库中删除的操作,直到撤消它的时间过去,但是我认为在代码中反映我将在 UI 中看到的内容会更加简化,只是为了保留内容1:1。

所以,我尝试在删除之前存储对象,然后更新它(这样它的_status 就不会再被删除了):

 this.lastDeletedDoc = this.docs[this.lastDeletedDocIndex];

 // remove from the db
 this.documents.delete(docId)
  .then(console.log.bind(console))
  .catch(console.error.bind(console));

// ...

// user taps "UNDO"
this.documents.update(this.lastDeletedDoc)
  .then(console.log.bind(console))
  .catch(console.error.bind(console));

但我收到了错误Error: Record with id=65660f62-3eb1-47b7-8746-5d0b2ef44eeb not found

我还尝试使用以下方法再次创建对象:

// user taps "UNDO"
this.documents.create(this.lastDeletedDoc, { useRecordId: true })
   .then(console.log.bind(console))
   .catch(console.error.bind(console));

但我收到 Id already present 错误。

我也快速浏览了源代码,但找不到任何undo 函数。

我通常如何撤消对未同步的 kinto 收藏的更改?

【问题讨论】:

标签: javascript undo kinto database nosql


【解决方案1】:

因此,您应该能够找回记录并将其_status 设置为之前的旧版本,就像您正在做的那样。

问题在于get 方法采用includeDeleted 选项,它允许您检索已删除的记录,但the update method doesn't pass it this option

解决此问题的最佳方法可能是在 Kinto.js 存储库上打开拉取请求,使 update 方法接受 includeDeleted 选项,然后将其传递给 get 方法。

由于现在连接有限,我无法推送更改,但它看起来基本上是这样的(+ 一个证明这可以正常工作的测试):

diff --git a/src/collection.js b/src/collection.js
index c0cce02..a0bf0e4 100644
--- a/src/collection.js
+++ b/src/collection.js
@@ -469,7 +469,7 @@ export default class Collection {
    * @param  {Object} options
    * @return {Promise}
    */
-  update(record, options={synced: false, patch: false}) {
+  update(record, options={synced: false, patch: false, includeDeleted:false}) {
     if (typeof(record) !== "object") {
       return Promise.reject(new Error("Record is not an object."));
     }
@@ -479,7 +479,7 @@ export default class Collection {
     if (!this.idSchema.validate(record.id)) {
       return Promise.reject(new Error(`Invalid Id: ${record.id}`));
     }
-    return this.get(record.id)
+    return this.get(record.id, {includeDeleted: options.includeDeleted})
       .then((res) => {
         const existing = res.data;
         const newStatus = options.synced ? "synced" : "updated";

不要犹豫,提交包含这些更改的拉取请求,我相信这应该可以解决您的问题!

【讨论】:

    【解决方案2】:

    我不确定将“未同步”与“用户可以撤消”结合起来是否是一个好的设计原则。如果您确定您只想撤消删除,那么以这种方式在同步延迟上搭载您的撤消功能是可行的,但是如果您将来想要支持撤消更新怎么办?旧值已经丢失。

    我认为您应该在您的应用中添加一个名为“撤消历史记录”的集合,您可以在其中存储具有撤消用户操作所需的所有数据的对象。如果您同步此收藏,则甚至可以删除手机上的某些内容,然后从笔记本电脑上撤消该操作! :)

    【讨论】:

    • 这是可靠的建议。我可能会提供一个 bin 功能,其中记录将每 x 天删除一次,例如 Android 的照片应用程序。无论如何,我认为即使没有提供您所说的功能,也可以选择取消删除记录。
    • 考虑一下,直接用 kinto 编写 bin 功能会很酷,这样我就可以在 init 阶段传递一个选项:new Kinto({ bin: { timeout: 60*60*24*60 }}),服务器将允许我取消删除记录已删除少于 60 天的内容。我想我会建议。
    猜你喜欢
    • 1970-01-01
    • 2022-07-10
    • 2010-09-26
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    相关资源
    最近更新 更多