【问题标题】:Is there any way to start a compound operation in response to an event in another compound operation?有没有办法启动一个复合操作来响应另一个复合操作中的事件?
【发布时间】:2015-09-24 13:57:44
【问题描述】:

在下面的代码中,一个项目被添加到复合操作中的协作列表中。在列表上的 VALUES_ADDED 事件处理程序中,启动另一个复合操作。运行代码时,我收到以下错误消息:Exception: Uncaught Error: gapi.drive.realtime.Error: {type: invalid_compound_operation, message: "Already committed this local change.", isFatal: true}

这似乎并不少见,并且在我的应用程序中自然出现,尽管方式更复杂,所以我不能将映射分配移动到原始复合操作中。我在实时 api 指南或参考文档中也找不到对这种限制的任何参考。有没有办法在复合操作结束之上的调用堆栈中开始新的复合操作?

var va = function(event) {
  doc.getModel().beginCompoundOperation('b');
  doc.getModel().getRoot().get('map').set('key', 'value');
  doc.getModel().endCompoundOperation();
};
doc.getModel().getRoot().get('list').addEventListener(gapi.drive.realtime.EventType.VALUES_ADDED, va);
doc.getModel().beginCompoundOperation('a');
doc.getModel().getRoot().get('list').push(100);
doc.getModel().endCompoundOperation();

【问题讨论】:

    标签: google-drive-realtime-api


    【解决方案1】:

    一般来说,您永远不应该在事件侦听器中写入实时模型。这样做会导致不必要的写入。例如,在您的代码中,文档上的每个协作者都会在列表被修改时写入,这可能不是您想要的。无意中在多个客户端之间创建写入周期也很容易。

    我们没有任何取消此限制的计划,但我会询问我们的文档团队,看看他们是否可以添加更好的解释。

    一般来说,我们的客户在将写入内容移动到原始复合 op 时没有遇到任何问题 - 您能否提供更多详细信息,说明为什么这对您的应用程序不切实际?

    谢谢, 布赖恩

    【讨论】:

    • 上下文:我在事件处理程序中实际做的是设置光标信息。 “光标”是指向协作列表中项目的指针。问题1:所有协作者都可以在删除时写入他们的光标信息,因为如果他们的光标所在的项目被删除,则必须重新分配光标。问题 2:光标移动到列表中新添加的项目,所以我可以把它放在原来的 CO 中,但是当我没有访问权限时,我也希望在重做时添加项目时光标移动到那里到 CO,所以我在事件处理程序中这样做
    • 您是否使用 IndexReferences 来跟踪光标?那应该可以处理很多您正在尝试做的事情..
    • 是的,我改用 IndexReference,它解决了我描述的两个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2020-03-10
    • 2017-08-26
    相关资源
    最近更新 更多