From 5c4916c7405385be8d1538fcaf01b9c4207b037e Mon Sep 17 00:00:00 2001 From: lixw Date: Wed, 20 Jul 2022 10:47:04 +0800 Subject: [PATCH] add option to UndoManager to control the behavior of destroy func --- src/utils/UndoManager.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/utils/UndoManager.js b/src/utils/UndoManager.js index 25e68c63..ecbe5ff3 100644 --- a/src/utils/UndoManager.js +++ b/src/utils/UndoManager.js @@ -139,6 +139,9 @@ const popStackItem = (undoManager, stack, eventType) => { * undo/redo scope. * @property {Set} [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} [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, deleteFilter = () => true, trackedOrigins = new Set([null]), - ignoreRemoteMapChanges = false + ignoreRemoteMapChanges = false, + shouldDestroyUndoManager = true } = {}) { super() /** @@ -172,6 +176,7 @@ export class UndoManager extends Observable { trackedOrigins.add(this) this.trackedOrigins = trackedOrigins this.captureTransaction = captureTransaction + this.shouldDestoryUndoManager = shouldDestroyUndoManager /** * @type {Array} */ @@ -370,6 +375,8 @@ export class UndoManager extends Observable { } destroy () { + if (!this.shouldDestoryUndoManager) return + this.trackedOrigins.delete(this) this.doc.off('afterTransaction', this.afterTransactionHandler) super.destroy()