improve: history stack memory
This commit is contained in:
@@ -62,7 +62,7 @@ import {
|
||||
WordBreak
|
||||
} from '../../dataset/enum/Editor'
|
||||
import { Control } from './control/Control'
|
||||
import { zipElementList } from '../../utils/element'
|
||||
import { getSlimCloneElementList, zipElementList } from '../../utils/element'
|
||||
import { CheckboxParticle } from './particle/CheckboxParticle'
|
||||
import { DeepRequired, IPadding } from '../../interface/Common'
|
||||
import {
|
||||
@@ -2059,23 +2059,26 @@ export class Draw {
|
||||
}
|
||||
// 历史记录用于undo、redo
|
||||
if (isSubmitHistory) {
|
||||
const self = this
|
||||
const oldElementList = deepClone(this.elementList)
|
||||
const oldHeaderElementList = deepClone(this.header.getElementList())
|
||||
const oldFooterElementList = deepClone(this.footer.getElementList())
|
||||
const { startIndex, endIndex } = this.range.getRange()
|
||||
const oldElementList = getSlimCloneElementList(this.elementList)
|
||||
const oldHeaderElementList = getSlimCloneElementList(
|
||||
this.header.getElementList()
|
||||
)
|
||||
const oldFooterElementList = getSlimCloneElementList(
|
||||
this.footer.getElementList()
|
||||
)
|
||||
const oldRange = deepClone(this.range.getRange())
|
||||
const pageNo = this.pageNo
|
||||
const oldPositionContext = deepClone(positionContext)
|
||||
const zone = this.zone.getZone()
|
||||
this.historyManager.execute(function () {
|
||||
self.zone.setZone(zone)
|
||||
self.setPageNo(pageNo)
|
||||
self.position.setPositionContext(deepClone(oldPositionContext))
|
||||
self.header.setElementList(deepClone(oldHeaderElementList))
|
||||
self.footer.setElementList(deepClone(oldFooterElementList))
|
||||
self.elementList = deepClone(oldElementList)
|
||||
self.range.setRange(startIndex, endIndex)
|
||||
self.render({
|
||||
this.historyManager.execute(() => {
|
||||
this.zone.setZone(zone)
|
||||
this.setPageNo(pageNo)
|
||||
this.position.setPositionContext(deepClone(oldPositionContext))
|
||||
this.header.setElementList(deepClone(oldHeaderElementList))
|
||||
this.footer.setElementList(deepClone(oldFooterElementList))
|
||||
this.elementList = deepClone(oldElementList)
|
||||
this.range.replaceRange(deepClone(oldRange))
|
||||
this.render({
|
||||
curIndex,
|
||||
isSubmitHistory: false,
|
||||
isSourceHistory: true
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
import { cloneProperty, deepClone, getUUID, isArrayEqual, splitText } from '.'
|
||||
import {
|
||||
cloneProperty,
|
||||
deepClone,
|
||||
deepCloneOmitKeys,
|
||||
getUUID,
|
||||
isArrayEqual,
|
||||
splitText
|
||||
} from '.'
|
||||
import {
|
||||
ElementType,
|
||||
IEditorOption,
|
||||
@@ -28,6 +35,7 @@ import {
|
||||
} from '../dataset/constant/Title'
|
||||
import { ControlComponent, ControlType } from '../dataset/enum/Control'
|
||||
import { DeepRequired } from '../interface/Common'
|
||||
import { IRowElement } from '../interface/Row'
|
||||
import { ITd } from '../interface/table/Td'
|
||||
import { ITr } from '../interface/table/Tr'
|
||||
|
||||
@@ -1169,3 +1177,10 @@ export function getTextFromElementList(elementList: IElement[]) {
|
||||
}
|
||||
return buildText(zipElementList(elementList))
|
||||
}
|
||||
|
||||
export function getSlimCloneElementList(elementList: IElement[]) {
|
||||
return deepCloneOmitKeys<IElement[], IRowElement>(elementList, [
|
||||
'metrics',
|
||||
'style'
|
||||
])
|
||||
}
|
||||
|
||||
@@ -31,6 +31,23 @@ export function throttle(func: Function, delay: number) {
|
||||
}
|
||||
}
|
||||
|
||||
export function deepCloneOmitKeys<T, K>(obj: T, omitKeys: (keyof K)[]): T {
|
||||
if (!obj || typeof obj !== 'object') {
|
||||
return obj
|
||||
}
|
||||
let newObj: any = {}
|
||||
if (Array.isArray(obj)) {
|
||||
newObj = obj.map(item => deepCloneOmitKeys(item, omitKeys))
|
||||
} else {
|
||||
// prettier-ignore
|
||||
(Object.keys(obj) as (keyof K)[]).forEach(key => {
|
||||
if (omitKeys.includes(key)) return
|
||||
return (newObj[key] = deepCloneOmitKeys((obj[key as unknown as keyof T] ), omitKeys))
|
||||
})
|
||||
}
|
||||
return newObj
|
||||
}
|
||||
|
||||
export function deepClone<T>(obj: T): T {
|
||||
if (!obj || typeof obj !== 'object') {
|
||||
return obj
|
||||
@@ -39,8 +56,8 @@ export function deepClone<T>(obj: T): T {
|
||||
if (Array.isArray(obj)) {
|
||||
newObj = obj.map(item => deepClone(item))
|
||||
} else {
|
||||
Object.keys(obj as any).forEach(key => {
|
||||
// @ts-ignore
|
||||
// prettier-ignore
|
||||
(Object.keys(obj) as (keyof T)[]).forEach(key => {
|
||||
return (newObj[key] = deepClone(obj[key]))
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user