==================最终处理方案回复=======================
之前说的写一个diff方法调用spreadJs api 做处理的思路,被放弃了,原因两点:1: 调用api生成,性能问题比较严重,很多更新没有找到批量操作的api,逐条遍历更新时间会很长。 2: 有些属性的修改没有找到设置的api,比如表格列的id等。直接用json的时候是可以修改的,但是api里不能设置。
====================================================
我最终实现方法是重写了 controlZ controlY,自己做了一个事件队列,每部变更都将最新数据记录到队列里。目前看没有什么性能问题。可以作为一个参考。
队列方法:
- import { spreadToJSON, jsonToSpread } from './contract.bridge'
- // 获取当前选中的表格
- export class ContractQueue {
- constructor(props) {
- this.spread = props
- this.list = []
- this.current = 0
- }
- do() {
- this.list = this.list.slice(0, this.current + 1)
- this.list.push(spreadToJSON(this.spread))
- this.current = this.list.length - 1
- console.log('this.list', this.list, this.current)
- }
- unDo() {
- this.current--
- if (this.current < 0) {
- this.current = 0
- return
- }
- this.setValue()
- }
- reDo() {
- this.current++
- if (this.current >= this.list.length) {
- this.current = this.list.length - 1
- return
- }
- this.setValue()
- }
- setValue() {
- if (!this.list[this.current]) return
- setTimeout(() => jsonToSpread(this.spread, this.list[this.current], true))
- console.log('this.list', this.list)
- }
- }
复制代码
// 初始化事件绑定
- function bindFns() {
- const _this = this
- this.contractEvent.addEvents('bindEvents', () => {
- const commandManager = _this.spread.commandManager()
- if (!commandManager.controlZ) {
- // 重写 controlZ 和 controlY 和 EditEnded
- _this.spread.commandManager().register('controlZ', () => {
- _this.contractQueue.unDo()
- })
- _this.spread.commandManager().setShortcutKey('controlZ')
- _this.spread.bind(GC.Spread.Sheets.Events.EditEnded, function (e, args) {
- _this.contractQueue.do()
- })
- _this.spread.commandManager().register('controlY', () => {
- _this.contractQueue.reDo()
- })
- _this.spread.commandManager().setShortcutKey('controlY')
- }
- })
- this.contractEvent.triggerEvents('bindEvents')
- }
复制代码
将json更新到spread
- function jsonToSpread(spread, json, addIntoQueue=true) {
- console.log('queue', queue)
- json.sheets.Sheet1.columnCount = 100
- console.log('jsonToSpread', json)
- spread.fromJSON(json)
- window.contractEvent.triggerEvents('bindEvents')
- if (addIntoQueue) {
- window.contractQueue.do()
- }
- }
复制代码
|