add option to UndoManager to control the behavior of destroy func

This commit is contained in:
lixw 2022-07-20 10:47:04 +08:00
parent 1bc9308566
commit 5c4916c740

View File

@ -139,6 +139,9 @@ const popStackItem = (undoManager, stack, eventType) => {
* undo/redo scope. * undo/redo scope.
* @property {Set<any>} [UndoManagerOptions.trackedOrigins=new Set([null])] * @property {Set<any>} [UndoManagerOptions.trackedOrigins=new Set([null])]
* @property {boolean} [ignoreRemoteMapChanges] Experimental. By default, the UndoManager will never overwrite remote changes. Enable this property to enable overwriting remote changes on key-value changes (Y.Map, properties on Y.Xml, etc..). * @property {boolean} [ignoreRemoteMapChanges] Experimental. By default, the UndoManager will never overwrite remote changes. Enable this property to enable overwriting remote changes on key-value changes (Y.Map, properties on Y.Xml, etc..).
* @property {boolean} [UndoManagerOptions.shouldDestroyUndoManager=true] Disable default destroy behavior if false. Sometimes
* when use undoManager to manage multiply components globally, each component (like y-prosemirror.yUndoPlugin...) may call destroy once being removed, then cause the global undoManager being destoryed.
* In this case, disable this option maybe be a choice to get the control back to yourself.
*/ */
/** /**
@ -160,7 +163,8 @@ export class UndoManager extends Observable {
captureTransaction = tr => true, captureTransaction = tr => true,
deleteFilter = () => true, deleteFilter = () => true,
trackedOrigins = new Set([null]), trackedOrigins = new Set([null]),
ignoreRemoteMapChanges = false ignoreRemoteMapChanges = false,
shouldDestroyUndoManager = true
} = {}) { } = {}) {
super() super()
/** /**
@ -172,6 +176,7 @@ export class UndoManager extends Observable {
trackedOrigins.add(this) trackedOrigins.add(this)
this.trackedOrigins = trackedOrigins this.trackedOrigins = trackedOrigins
this.captureTransaction = captureTransaction this.captureTransaction = captureTransaction
this.shouldDestoryUndoManager = shouldDestroyUndoManager
/** /**
* @type {Array<StackItem>} * @type {Array<StackItem>}
*/ */
@ -370,6 +375,8 @@ export class UndoManager extends Observable {
} }
destroy () { destroy () {
if (!this.shouldDestoryUndoManager) return
this.trackedOrigins.delete(this) this.trackedOrigins.delete(this)
this.doc.off('afterTransaction', this.afterTransactionHandler) this.doc.off('afterTransaction', this.afterTransactionHandler)
super.destroy() super.destroy()