如何跨模型更改维护UI状态?

时间:2015-05-14 19:52:19

标签: google-drive-realtime-api

我有一个对象的CollaborativeList,其状态在UI中被选中。用户可以采取的一个动作导致一个对象被移除,并且在其位置添加了许多对象。我有ValuesRemoved和ValuesAdded事件的处理程序,它们分别丢弃和添加新视图。如果选择了旧元素,那么设置新添加的UI元素的选择状态的最佳方法是什么?

我可以在进行在ValuesAddedEvent处理程序中检查的模型更改之前在控件类上设置一个标志,但这不允许我在修改的undo / redo上维护选择状态。撤消/重做似乎也没有采用导致原始事件的更改的复合操作名称列表,因此我也无法检查。

test('Compound Operation Names in undo', function() {
  doc.getModel().beginCompoundOperation('a name');
  doc.getModel().getRoot().set('key','value');
  doc.getModel().endCompoundOperation();
  var vc = function(event) {
    deepEqual(event.compoundOperationNames, ['a name']);
  };
  doc.getModel().getRoot().addEventListener(gapi.drive.realtime.EventType.VALUE_CHANGED, vc);
  doc.getModel().undo();
  doc.getModel().getRoot().removeEventListener(gapi.drive.realtime.EventType.VALUE_CHANGED, vc);
});

测试失败,预期:['a name'],实际:[]

1 个答案:

答案 0 :(得分:1)

您可以使用IndexReferences跟踪模型中的选定范围。如果在您的应用程序中有意义的话,这将带来允许您向协作者显示信息的附带好处。

如果您不想坚持下去,那么我认为您应该能够通过查看更改集+当前选择来确定您何时处于这种情况。

如果列表中有ObjectChangedListener,您将获得一个包含复合操作中所有更改的事件。如果您有一组与行为匹配的更改,并且引用的索引是当前选择的一个,那么您知道您处于这种情况并且可以根据行为进行操作。