将动态创建的对象更改的 EventStream 添加到 UndoManager
Add EventStream of dynamically created object changes to UndoManager
使用 UndoFX library,我创建了一个 UndoManger,如下所示:
EventStream<DocumentChange<?>> changes = document.getChanges();
undoManager =
UndoManagerFactory.unlimitedHistoryUndoManager(
changes,
c -> c.redo(),
c -> c.undo(),
(c1, c2) -> c1.mergeWith(c2)
);
文档返回的ReactFX EventStream
是通过合并文档创建时可用的多个EventStreams创建的。例如,
documentChanges = EventStreams.merge(selectedSymbolChanges, symbolListChanges);
但是,文档稍后会添加项目,这些项目包括也应该发布到文档 EventStream 的 EventStreams。我试过了
documentChanges = EventStreams.merge(documentChanges, newObjectChanges);
但是,newObjectChanges
EventStream 中的更改永远不会影响 UndoManager。
在创建 UndoManger 后,将其他 EventStreams 合并到 UndoManger 的最佳方法是什么?或者这是不可能的(即流必须是不可变的)?
如果是后者,如何为创建 UndoManager 时不存在的动态数量的对象创建流?
有两种方法可以解决这个问题。
创建一个 ObservableSet
事件流并使用 EventStreams.merge(ObservableSet) 动态合并集合中的所有流。然后,您可以动态 add/remove 流 to/from 集合。
使用 ConnectableEventStream
作为占位符,然后将其连接到动态获取的流:
ConnectableEventStream<DocumentChange<?>> dynamicChanges =
new ConnectableEventSource<>();
EventStream<DocumentChange<?>> documentChanges =
EventStreams.merge(staticChanges, dynamicChanges);
// later
dynamicChanges.connectTo(newObjectChanges1);
dynamicChanges.connectTo(newObjectChanges2);
使用 UndoFX library,我创建了一个 UndoManger,如下所示:
EventStream<DocumentChange<?>> changes = document.getChanges();
undoManager =
UndoManagerFactory.unlimitedHistoryUndoManager(
changes,
c -> c.redo(),
c -> c.undo(),
(c1, c2) -> c1.mergeWith(c2)
);
文档返回的ReactFX EventStream
是通过合并文档创建时可用的多个EventStreams创建的。例如,
documentChanges = EventStreams.merge(selectedSymbolChanges, symbolListChanges);
但是,文档稍后会添加项目,这些项目包括也应该发布到文档 EventStream 的 EventStreams。我试过了
documentChanges = EventStreams.merge(documentChanges, newObjectChanges);
但是,newObjectChanges
EventStream 中的更改永远不会影响 UndoManager。
在创建 UndoManger 后,将其他 EventStreams 合并到 UndoManger 的最佳方法是什么?或者这是不可能的(即流必须是不可变的)?
如果是后者,如何为创建 UndoManager 时不存在的动态数量的对象创建流?
有两种方法可以解决这个问题。
创建一个
ObservableSet
事件流并使用 EventStreams.merge(ObservableSet) 动态合并集合中的所有流。然后,您可以动态 add/remove 流 to/from 集合。使用
ConnectableEventStream
作为占位符,然后将其连接到动态获取的流:ConnectableEventStream<DocumentChange<?>> dynamicChanges = new ConnectableEventSource<>(); EventStream<DocumentChange<?>> documentChanges = EventStreams.merge(staticChanges, dynamicChanges); // later dynamicChanges.connectTo(newObjectChanges1); dynamicChanges.connectTo(newObjectChanges2);