@visactor/vtable-sheet 1.23.1-alpha.2 → 1.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/components/sheet-tab-event-handler.js +3 -2
- package/cjs/components/sheet-tab-event-handler.js.map +1 -1
- package/cjs/components/vtable-sheet.d.ts +4 -1
- package/cjs/components/vtable-sheet.js +115 -17
- package/cjs/components/vtable-sheet.js.map +1 -1
- package/cjs/core/WorkSheet.d.ts +3 -1
- package/cjs/core/WorkSheet.js +45 -21
- package/cjs/core/WorkSheet.js.map +1 -1
- package/cjs/core/table-plugins.d.ts +5 -0
- package/cjs/core/table-plugins.js +10 -9
- package/cjs/core/table-plugins.js.map +1 -1
- package/cjs/event/table-event-relay.js +1 -0
- package/cjs/event/table-event-relay.js.map +1 -1
- package/cjs/formula/formula-engine.js +0 -1
- package/cjs/formula/formula-engine.js.map +1 -1
- package/cjs/index.d.ts +3 -3
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/managers/formula-manager.d.ts +3 -1
- package/cjs/managers/formula-manager.js +39 -15
- package/cjs/managers/formula-manager.js.map +1 -1
- package/cjs/managers/menu-manager.d.ts +2 -0
- package/cjs/managers/menu-manager.js +3 -0
- package/cjs/managers/menu-manager.js.map +1 -1
- package/cjs/managers/sheet-manager.d.ts +1 -0
- package/cjs/managers/sheet-manager.js +7 -0
- package/cjs/managers/sheet-manager.js.map +1 -1
- package/cjs/managers/tab-drag-manager.d.ts +2 -2
- package/cjs/managers/tab-drag-manager.js.map +1 -1
- package/cjs/sheet-helper.d.ts +2 -0
- package/cjs/sheet-helper.js +15 -3
- package/cjs/sheet-helper.js.map +1 -1
- package/cjs/ts-types/index.d.ts +2 -1
- package/cjs/ts-types/index.js.map +1 -1
- package/cjs/ts-types/sheet.d.ts +12 -7
- package/cjs/ts-types/sheet.js.map +1 -1
- package/dist/vtable-sheet.js +867 -225
- package/dist/vtable-sheet.min.js +1 -1
- package/es/components/sheet-tab-event-handler.js +3 -2
- package/es/components/sheet-tab-event-handler.js.map +1 -1
- package/es/components/vtable-sheet.d.ts +4 -1
- package/es/components/vtable-sheet.js +117 -16
- package/es/components/vtable-sheet.js.map +1 -1
- package/es/core/WorkSheet.d.ts +3 -1
- package/es/core/WorkSheet.js +44 -21
- package/es/core/WorkSheet.js.map +1 -1
- package/es/core/table-plugins.d.ts +5 -0
- package/es/core/table-plugins.js +8 -7
- package/es/core/table-plugins.js.map +1 -1
- package/es/event/table-event-relay.js +1 -0
- package/es/event/table-event-relay.js.map +1 -1
- package/es/formula/formula-engine.js +0 -1
- package/es/formula/formula-engine.js.map +1 -1
- package/es/index.d.ts +3 -3
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/managers/formula-manager.d.ts +3 -1
- package/es/managers/formula-manager.js +39 -15
- package/es/managers/formula-manager.js.map +1 -1
- package/es/managers/menu-manager.d.ts +2 -0
- package/es/managers/menu-manager.js +3 -0
- package/es/managers/menu-manager.js.map +1 -1
- package/es/managers/sheet-manager.d.ts +1 -0
- package/es/managers/sheet-manager.js +7 -0
- package/es/managers/sheet-manager.js.map +1 -1
- package/es/managers/tab-drag-manager.d.ts +2 -2
- package/es/managers/tab-drag-manager.js.map +1 -1
- package/es/sheet-helper.d.ts +2 -0
- package/es/sheet-helper.js +11 -0
- package/es/sheet-helper.js.map +1 -1
- package/es/ts-types/index.d.ts +2 -1
- package/es/ts-types/index.js.map +1 -1
- package/es/ts-types/sheet.d.ts +12 -7
- package/es/ts-types/sheet.js.map +1 -1
- package/package.json +8 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/event/table-event-relay.ts"],"names":[],"mappings":"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","file":"table-event-relay.js","sourcesContent":["/**\n * Table 事件中转器\n * 核心功能:\n * 1. 在 VTableSheet 层注册事件监听器\n * 2. 在每个 WorkSheet 初始化时,自动绑定事件到其 tableInstance\n * 3. 当事件触发时,自动附带 sheetKey 信息\n */\n\nimport type { ListTable } from '@visactor/vtable';\nimport type { TableEventHandlersEventArgumentMap } from '@visactor/vtable/es/ts-types/events';\nimport type { ISpreadsheetEventSource } from './event-interfaces';\n\ntype EventCallback = (...args: any[]) => void;\n\ninterface EventHandler {\n callback: (event: any) => void;\n /** 存储每个sheet的包装回调,避免内存泄漏 */\n wrappedCallbacks: Map<string, EventCallback>;\n}\n\n/**\n * 增强的事件对象,自动附带 sheetKey\n */\nexport interface EnhancedTableEvent {\n /** 触发事件的 sheet key */\n sheetKey: string;\n /** 原始 VTable 事件的所有属性 */\n [key: string]: any;\n}\n\n/**\n * Table 事件中转器类(用于 VTableSheet)\n *\n * 在 VTableSheet 层统一管理所有 sheet 的 table 事件\n * 当任何 sheet 触发事件时,自动附带 sheetKey 信息\n */\nexport class TableEventRelay {\n /** 事件映射表 - 存储用户注册的监听器 */\n private _tableEventMap: Record<string, EventHandler[]> = {};\n\n /** VTableSheet 引用 */\n private vtableSheet: ISpreadsheetEventSource;\n\n /** 跟踪已绑定的sheet,防止重复绑定 */\n private boundSheets: Set<string> = new Set();\n\n /** 清理监听器,防止内存泄漏 */\n private cleanupCallbacks: Map<string, () => void> = new Map();\n\n constructor(vtableSheet: ISpreadsheetEventSource) {\n this.vtableSheet = vtableSheet;\n }\n\n /**\n * 注册 Table 事件监听器(在 VTableSheet 层)\n *\n * 会监听所有 sheet 的 tableInstance 事件,并在回调时自动附带 sheetKey\n *\n * @example\n * ```typescript\n * // 在 VTableSheet 层注册\n * sheet.onTableEvent('click_cell', (event) => {\n * // event.sheetKey 告诉你是哪个 sheet\n * // event 的其他属性是原始 VTable 事件\n * console.log(`Sheet ${event.sheetKey} 的单元格 [${event.row}, ${event.col}] 被点击`);\n * });\n * ```\n */\n onTableEvent<K extends keyof TableEventHandlersEventArgumentMap>(\n type: K,\n callback: (event: TableEventHandlersEventArgumentMap[K] & { sheetKey: string }) => void\n ): void {\n if (!this._tableEventMap[type]) {\n this._tableEventMap[type] = [];\n }\n\n // 检查是否已经注册过该回调,避免重复注册\n const existingCallbacks = this._tableEventMap[type];\n const isAlreadyRegistered = existingCallbacks.some(item => item.callback === callback);\n\n if (!isAlreadyRegistered) {\n this._tableEventMap[type].push({\n callback,\n wrappedCallbacks: new Map<string, EventCallback>()\n });\n\n // 为所有已存在的 sheet 绑定事件\n this.bindToAllSheets(type);\n }\n }\n\n /**\n * 移除 Table 事件监听器\n *\n * @param type 事件类型\n * @param callback 回调函数(可选,不传则移除该类型的所有监听器)\n */\n offTableEvent(type: string, callback?: EventCallback): void {\n if (!this._tableEventMap[type]) {\n return;\n }\n\n if (!callback) {\n // 移除所有监听器\n const handlers = this._tableEventMap[type];\n // 先清理所有包装回调\n handlers.forEach(handler => {\n this.cleanupWrappedCallbacks(handler, type);\n });\n\n delete this._tableEventMap[type];\n // 从所有 sheet 解绑\n this.unbindFromAllSheets(type);\n } else {\n // 移除特定监听器\n const index = this._tableEventMap[type].findIndex(h => h.callback === callback);\n if (index >= 0) {\n const handler = this._tableEventMap[type][index];\n // 清理该监听器的包装回调\n this.cleanupWrappedCallbacks(handler, type);\n\n this._tableEventMap[type].splice(index, 1);\n\n if (this._tableEventMap[type].length === 0) {\n delete this._tableEventMap[type];\n // 从所有 sheet 解绑\n this.unbindFromAllSheets(type);\n }\n }\n }\n }\n\n /**\n * 清理包装回调,避免内存泄漏\n */\n private cleanupWrappedCallbacks(handler: EventHandler, eventType: string): void {\n handler.wrappedCallbacks.forEach((wrappedCallback, sheetKey) => {\n const worksheet = this.vtableSheet.workSheetInstances.get(sheetKey);\n if (worksheet?.tableInstance) {\n worksheet.tableInstance.off(eventType as any, wrappedCallback);\n }\n });\n handler.wrappedCallbacks.clear();\n }\n\n /**\n * 为特定 sheet 绑定事件\n * 在 WorkSheet 初始化时调用\n *\n * @param sheetKey sheet 的 key\n * @param tableInstance VTable 的 ListTable 实例\n * @internal\n */\n bindSheetEvents(sheetKey: string, tableInstance: ListTable): void {\n // 防止重复绑定\n if (this.boundSheets.has(sheetKey)) {\n console.warn(`[TableEventRelay] Sheet ${sheetKey} 已经绑定过事件,跳过重复绑定`);\n return;\n }\n\n // 为这个 sheet 绑定所有已注册的事件\n for (const eventType in this._tableEventMap) {\n this.bindSheetEvent(sheetKey, tableInstance, eventType);\n }\n\n this.boundSheets.add(sheetKey);\n\n // 注册清理回调,当sheet销毁时自动清理\n const cleanup = () => {\n this.unbindSheetEvents(sheetKey, tableInstance);\n this.boundSheets.delete(sheetKey);\n this.cleanupCallbacks.delete(sheetKey);\n };\n\n this.cleanupCallbacks.set(sheetKey, cleanup);\n }\n\n /**\n * 为特定 sheet 绑定单个事件类型\n *\n * @param sheetKey sheet 的 key\n * @param tableInstance VTable 的 ListTable 实例\n * @param eventType 事件类型\n * @private\n */\n private bindSheetEvent(sheetKey: string, tableInstance: ListTable, eventType: string): void {\n const handlers = this._tableEventMap[eventType] || [];\n\n handlers.forEach(handler => {\n // 检查是否已经绑定过这个事件\n if (handler.wrappedCallbacks.has(sheetKey)) {\n // 如果已经绑定过,先解绑旧的\n const oldCallback = handler.wrappedCallbacks.get(sheetKey)!;\n tableInstance.off(eventType as any, oldCallback);\n }\n\n // 创建包装函数,自动附带 sheetKey\n const wrappedCallback = (...args: any[]) => {\n // 增强事件对象,添加 sheetKey\n const enhancedEvent: EnhancedTableEvent = {\n sheetKey: sheetKey,\n ...args[0] // 原始事件对象的所有属性\n };\n\n // 调用用户的回调,传入增强后的事件对象\n handler.callback(enhancedEvent);\n };\n\n // 保存包装函数的引用,用于后续解绑\n handler.wrappedCallbacks.set(sheetKey, wrappedCallback);\n\n // 绑定到 tableInstance(VTable 的 on 方法不支持 query 参数)\n tableInstance.on(eventType as any, wrappedCallback);\n });\n }\n\n /**\n * 为所有已存在的 sheet 绑定事件\n * 在用户注册新事件时调用\n *\n * @param eventType 事件类型\n * @private\n */\n private bindToAllSheets(eventType: string): void {\n this.vtableSheet.workSheetInstances.forEach((worksheet, sheetKey) => {\n if (worksheet.tableInstance) {\n this.bindSheetEvent(sheetKey, worksheet.tableInstance, eventType);\n }\n });\n }\n\n /**\n * 从特定 sheet 解绑事件\n * 在 WorkSheet 销毁时调用\n *\n * @param sheetKey sheet 的 key\n * @param tableInstance VTable 的 ListTable 实例\n * @internal\n */\n unbindSheetEvents(sheetKey: string, tableInstance: ListTable): void {\n // 解绑所有事件\n for (const eventType in this._tableEventMap) {\n const handlers = this._tableEventMap[eventType] || [];\n\n handlers.forEach(handler => {\n const wrappedCallback = handler.wrappedCallbacks.get(sheetKey);\n if (wrappedCallback) {\n tableInstance.off(eventType as any, wrappedCallback);\n handler.wrappedCallbacks.delete(sheetKey);\n }\n });\n }\n }\n\n /**\n * 从所有 sheet 解绑特定事件类型\n *\n * @param eventType 事件类型\n * @private\n */\n private unbindFromAllSheets(eventType: string): void {\n this.vtableSheet.workSheetInstances.forEach((worksheet, sheetKey) => {\n if (worksheet.tableInstance) {\n const handlers = this._tableEventMap[eventType] || [];\n handlers.forEach(handler => {\n const wrappedCallback = handler.wrappedCallbacks.get(sheetKey);\n if (wrappedCallback) {\n worksheet.tableInstance.off(eventType as any, wrappedCallback);\n handler.wrappedCallbacks.delete(sheetKey);\n }\n });\n }\n });\n }\n\n /**\n * 获取所有已注册的事件类型\n */\n getRegisteredEventTypes(): string[] {\n return Object.keys(this._tableEventMap);\n }\n\n /**\n * 获取特定事件类型的监听器数量\n */\n getListenerCount(type: string): number {\n return this._tableEventMap[type]?.length || 0;\n }\n\n /**\n * 清除所有事件监听器\n */\n clearAllListeners(): void {\n // 执行所有清理回调\n for (const cleanup of this.cleanupCallbacks.values()) {\n cleanup();\n }\n\n // 从所有 sheet 解绑\n this.vtableSheet.workSheetInstances.forEach((worksheet, sheetKey) => {\n if (worksheet.tableInstance) {\n this.unbindSheetEvents(sheetKey, worksheet.tableInstance);\n }\n });\n\n // 清空状态\n this._tableEventMap = {};\n this.boundSheets.clear();\n this.cleanupCallbacks.clear();\n }\n\n /**\n * 销毁事件中转器\n * 彻底清理所有资源,防止内存泄漏\n */\n destroy(): void {\n this.clearAllListeners();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/event/table-event-relay.ts"],"names":[],"mappings":"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","file":"table-event-relay.js","sourcesContent":["/**\n * Table 事件中转器\n * 核心功能:\n * 1. 在 VTableSheet 层注册事件监听器\n * 2. 在每个 WorkSheet 初始化时,自动绑定事件到其 tableInstance\n * 3. 当事件触发时,自动附带 sheetKey 信息\n */\n\nimport type { ListTable } from '@visactor/vtable';\nimport type { TableEventHandlersEventArgumentMap } from '@visactor/vtable/es/ts-types/events';\nimport type { ISpreadsheetEventSource } from './event-interfaces';\n\ntype EventCallback = (...args: any[]) => void;\n\ninterface EventHandler {\n callback: (event: any) => void;\n /** 存储每个sheet的包装回调,避免内存泄漏 */\n wrappedCallbacks: Map<string, EventCallback>;\n}\n\n/**\n * 增强的事件对象,自动附带 sheetKey\n */\nexport interface EnhancedTableEvent {\n /** 触发事件的 sheet key */\n sheetKey: string;\n /** 原始 VTable 事件的所有属性 */\n [key: string]: any;\n}\n\n/**\n * Table 事件中转器类(用于 VTableSheet)\n *\n * 在 VTableSheet 层统一管理所有 sheet 的 table 事件\n * 当任何 sheet 触发事件时,自动附带 sheetKey 信息\n */\nexport class TableEventRelay {\n /** 事件映射表 - 存储用户注册的监听器 */\n private _tableEventMap: Record<string, EventHandler[]> = {};\n\n /** VTableSheet 引用 */\n private vtableSheet: ISpreadsheetEventSource;\n\n /** 跟踪已绑定的sheet,防止重复绑定 */\n private boundSheets: Set<string> = new Set();\n\n /** 清理监听器,防止内存泄漏 */\n private cleanupCallbacks: Map<string, () => void> = new Map();\n\n constructor(vtableSheet: ISpreadsheetEventSource) {\n this.vtableSheet = vtableSheet;\n }\n\n /**\n * 注册 Table 事件监听器(在 VTableSheet 层)\n *\n * 会监听所有 sheet 的 tableInstance 事件,并在回调时自动附带 sheetKey\n *\n * @example\n * ```typescript\n * // 在 VTableSheet 层注册\n * sheet.onTableEvent('click_cell', (event) => {\n * // event.sheetKey 告诉你是哪个 sheet\n * // event 的其他属性是原始 VTable 事件\n * console.log(`Sheet ${event.sheetKey} 的单元格 [${event.row}, ${event.col}] 被点击`);\n * });\n * ```\n */\n onTableEvent<K extends keyof TableEventHandlersEventArgumentMap>(\n type: K,\n callback: (event: TableEventHandlersEventArgumentMap[K] & { sheetKey: string }) => void\n ): void {\n if (!this._tableEventMap[type]) {\n this._tableEventMap[type] = [];\n }\n\n // 检查是否已经注册过该回调,避免重复注册\n const existingCallbacks = this._tableEventMap[type];\n const isAlreadyRegistered = existingCallbacks.some(item => item.callback === callback);\n\n if (!isAlreadyRegistered) {\n this._tableEventMap[type].push({\n callback,\n wrappedCallbacks: new Map<string, EventCallback>()\n });\n\n // 为所有已存在的 sheet 绑定事件\n this.bindToAllSheets(type);\n }\n }\n\n /**\n * 移除 Table 事件监听器\n *\n * @param type 事件类型\n * @param callback 回调函数(可选,不传则移除该类型的所有监听器)\n */\n offTableEvent(type: string, callback?: EventCallback): void {\n if (!this._tableEventMap[type]) {\n return;\n }\n\n if (!callback) {\n // 移除所有监听器\n const handlers = this._tableEventMap[type];\n // 先清理所有包装回调\n handlers.forEach(handler => {\n this.cleanupWrappedCallbacks(handler, type);\n });\n\n delete this._tableEventMap[type];\n // 从所有 sheet 解绑\n this.unbindFromAllSheets(type);\n } else {\n // 移除特定监听器\n const index = this._tableEventMap[type].findIndex(h => h.callback === callback);\n if (index >= 0) {\n const handler = this._tableEventMap[type][index];\n // 清理该监听器的包装回调\n this.cleanupWrappedCallbacks(handler, type);\n\n this._tableEventMap[type].splice(index, 1);\n\n if (this._tableEventMap[type].length === 0) {\n delete this._tableEventMap[type];\n // 从所有 sheet 解绑\n this.unbindFromAllSheets(type);\n }\n }\n }\n }\n\n /**\n * 清理包装回调,避免内存泄漏\n */\n private cleanupWrappedCallbacks(handler: EventHandler, eventType: string): void {\n handler.wrappedCallbacks.forEach((wrappedCallback, sheetKey) => {\n const worksheet = this.vtableSheet.workSheetInstances.get(sheetKey);\n if (worksheet?.tableInstance) {\n worksheet.tableInstance.off(eventType as any, wrappedCallback);\n }\n });\n handler.wrappedCallbacks.clear();\n }\n\n /**\n * 为特定 sheet 绑定事件\n * 在 WorkSheet 初始化时调用\n *\n * @param sheetKey sheet 的 key\n * @param tableInstance VTable 的 ListTable 实例\n * @internal\n */\n bindSheetEvents(sheetKey: string, tableInstance: ListTable): void {\n // 防止重复绑定\n if (this.boundSheets.has(sheetKey)) {\n console.warn(`[TableEventRelay] Sheet ${sheetKey} 已经绑定过事件,跳过重复绑定`);\n return;\n }\n\n // 为这个 sheet 绑定所有已注册的事件\n for (const eventType in this._tableEventMap) {\n this.bindSheetEvent(sheetKey, tableInstance, eventType);\n }\n\n this.boundSheets.add(sheetKey);\n\n // 注册清理回调,当sheet销毁时自动清理\n const cleanup = () => {\n this.unbindSheetEvents(sheetKey, tableInstance);\n this.boundSheets.delete(sheetKey);\n this.cleanupCallbacks.delete(sheetKey);\n };\n\n this.cleanupCallbacks.set(sheetKey, cleanup);\n }\n\n /**\n * 为特定 sheet 绑定单个事件类型\n *\n * @param sheetKey sheet 的 key\n * @param tableInstance VTable 的 ListTable 实例\n * @param eventType 事件类型\n * @private\n */\n private bindSheetEvent(sheetKey: string, tableInstance: ListTable, eventType: string): void {\n const handlers = this._tableEventMap[eventType] || [];\n\n handlers.forEach(handler => {\n // 检查是否已经绑定过这个事件\n if (handler.wrappedCallbacks.has(sheetKey)) {\n // 如果已经绑定过,先解绑旧的\n const oldCallback = handler.wrappedCallbacks.get(sheetKey)!;\n tableInstance.off(eventType as any, oldCallback);\n }\n\n // 创建包装函数,自动附带 sheetKey\n const wrappedCallback = (...args: any[]) => {\n // 增强事件对象,添加 sheetKey\n const enhancedEvent: EnhancedTableEvent = {\n sheetKey: sheetKey,\n ...args[0] // 原始事件对象的所有属性\n };\n\n // 调用用户的回调,传入增强后的事件对象\n handler.callback(enhancedEvent);\n };\n\n // 保存包装函数的引用,用于后续解绑\n handler.wrappedCallbacks.set(sheetKey, wrappedCallback);\n\n // 绑定到 tableInstance(VTable 的 on 方法不支持 query 参数)\n tableInstance.on(eventType as any, wrappedCallback);\n });\n }\n\n /**\n * 为所有已存在的 sheet 绑定事件\n * 在用户注册新事件时调用\n *\n * @param eventType 事件类型\n * @private\n */\n private bindToAllSheets(eventType: string): void {\n this.vtableSheet.workSheetInstances.forEach((worksheet, sheetKey) => {\n if (worksheet.tableInstance) {\n this.bindSheetEvent(sheetKey, worksheet.tableInstance, eventType);\n }\n });\n }\n\n /**\n * 从特定 sheet 解绑事件\n * 在 WorkSheet 销毁时或 activateSheet 切换时调用\n *\n * @param sheetKey sheet 的 key\n * @param tableInstance VTable 的 ListTable 实例\n * @internal\n */\n unbindSheetEvents(sheetKey: string, tableInstance: ListTable): void {\n // 解绑所有事件\n for (const eventType in this._tableEventMap) {\n const handlers = this._tableEventMap[eventType] || [];\n\n handlers.forEach(handler => {\n const wrappedCallback = handler.wrappedCallbacks.get(sheetKey);\n if (wrappedCallback) {\n tableInstance.off(eventType as any, wrappedCallback);\n handler.wrappedCallbacks.delete(sheetKey);\n }\n });\n }\n\n // 清除 boundSheets 和 cleanupCallbacks,以便后续 bindSheetEvents 能重新绑定\n // 否则 activateSheet 在 unbind 后调用 bindSheetEvents 时会因 boundSheets.has(sheetKey) 而跳过,导致事件失效\n this.boundSheets.delete(sheetKey);\n this.cleanupCallbacks.delete(sheetKey);\n }\n\n /**\n * 从所有 sheet 解绑特定事件类型\n *\n * @param eventType 事件类型\n * @private\n */\n private unbindFromAllSheets(eventType: string): void {\n this.vtableSheet.workSheetInstances.forEach((worksheet, sheetKey) => {\n if (worksheet.tableInstance) {\n const handlers = this._tableEventMap[eventType] || [];\n handlers.forEach(handler => {\n const wrappedCallback = handler.wrappedCallbacks.get(sheetKey);\n if (wrappedCallback) {\n worksheet.tableInstance.off(eventType as any, wrappedCallback);\n handler.wrappedCallbacks.delete(sheetKey);\n }\n });\n }\n });\n }\n\n /**\n * 获取所有已注册的事件类型\n */\n getRegisteredEventTypes(): string[] {\n return Object.keys(this._tableEventMap);\n }\n\n /**\n * 获取特定事件类型的监听器数量\n */\n getListenerCount(type: string): number {\n return this._tableEventMap[type]?.length || 0;\n }\n\n /**\n * 清除所有事件监听器\n */\n clearAllListeners(): void {\n // 执行所有清理回调\n for (const cleanup of this.cleanupCallbacks.values()) {\n cleanup();\n }\n\n // 从所有 sheet 解绑\n this.vtableSheet.workSheetInstances.forEach((worksheet, sheetKey) => {\n if (worksheet.tableInstance) {\n this.unbindSheetEvents(sheetKey, worksheet.tableInstance);\n }\n });\n\n // 清空状态\n this._tableEventMap = {};\n this.boundSheets.clear();\n this.cleanupCallbacks.clear();\n }\n\n /**\n * 销毁事件中转器\n * 彻底清理所有资源,防止内存泄漏\n */\n destroy(): void {\n this.clearAllListeners();\n }\n}\n"]}
|
|
@@ -1030,7 +1030,6 @@ class FormulaEngine {
|
|
|
1030
1030
|
removeSheet(sheetKey) {
|
|
1031
1031
|
const sheetId = this.sheets.get(sheetKey);
|
|
1032
1032
|
if (void 0 === sheetId) return;
|
|
1033
|
-
if (this.sheets.size <= 1) throw new Error("Cannot remove the last sheet");
|
|
1034
1033
|
this.sheetData.delete(sheetId), this.sheets.delete(sheetKey), this.reverseSheets.delete(sheetId);
|
|
1035
1034
|
const keysToRemove = [];
|
|
1036
1035
|
for (const entry of Array.from(this.formulaCells.entries())) {
|