import { showloading, hideloading } from '../global/loading'; import { luckysheetrefreshgrid, jfrefreshgrid_rhcw } from '../global/refresh'; import { sheetHTML, luckyColor } from './constant'; import sheetmanage from './sheetmanage'; import menuButton from './menuButton'; import { createFilterOptions } from './filter'; import luckysheetFreezen from './freezen'; import luckysheetPostil from './postil'; import { getObjType, replaceHtml, getByteLen } from '../utils/util'; import { getSheetIndex } from '../methods/get'; import Store from '../store'; import locale from '../locale/locale'; const server = { gridKey: null, loadUrl: null, updateUrl: null, updateImageUrl: null, title: null, loadSheetUrl: null, allowUpdate: false, //共享编辑模式 historyParam: function(data, sheetIndex, range) { let _this = this; let r1 = range.row[0], r2 = range.row[1]; let c1 = range.column[0], c2 = range.column[1]; if(r1 == r2 && c1 == c2){ //单个单元格更新 let v = data[r1][c1]; _this.saveParam("v", sheetIndex, v, { "r": r1, "c": c1 }); } else{ //范围单元格更新 let rowlen = r2 - r1 + 1; let collen = c2 - c1 + 1; let timeR = Math.floor(1000 / collen); let n = Math.ceil(rowlen / timeR); //分批次更新,一次最多1000个单元格 for(let i = 0; i < n; i++){ let str = r1 + timeR * i; let edr; if(i == n - 1){ edr = r2; } else{ edr = r1 + timeR * (i + 1) - 1; } let v = []; for(let r = str; r <= edr; r++){ let v_row = []; for(let c = c1; c <= c2; c++){ v_row.push(data[r][c]); } v.push(v_row); } _this.saveParam("rv", sheetIndex, v, { "range": { "row": [str, edr], "column": [c1, c2] } }); if(i == n - 1){ _this.saveParam("rv_end", sheetIndex, null); } } } }, saveParam: function (type, index, value, params) { let _this = this; if(!_this.allowUpdate){ return; } if(value == undefined){ value = null; } let d = {}; d.t = type; d.i = index; d.v = value; if (type == "rv") { //单元格批量更新 d.range = params.range; } else if (type == "v" || type == "fu" || type == "fm") { d.r = params.r; d.c = params.c; } else if (type == "fc") { d.op = params.op; d.pos = params.pos; } else if (type == "drc" || type == "arc" || type == "h" || type == "wh") { d.rc = params.rc; } else if (type == "c") { d.cid = params.cid; d.op = params.op; } else if (type == "f") { d.op = params.op; d.pos = params.pos; } else if (type == "s") { } else if (type == "sh") { d.op = params.op; if(params.cur != null){ d.cur = params.cur; } } else if (type == "cg") { d.k = params.k; } else if (type == "all") { d.k = params.k; // d.s = params.s; } let msg = pako.gzip(encodeURIComponent(JSON.stringify(d)), { to: "string" }); if(_this.websocket!=null){ _this.websocket.send(msg); } }, websocket: null, wxErrorCount: 0, openWebSocket: function(){ let _this = this; if('WebSocket' in window){ _this.websocket = new WebSocket(_this.updateUrl + "?t=111&g=" + encodeURIComponent(_this.gridKey)); //连接建立时触发 _this.websocket.onopen = function() { console.info('WebSocket连接成功'); hideloading(); _this.wxErrorCount = 0; //防止websocket长时间不发送消息导致断连 setInterval(function(){ _this.websocket.send("rub"); }, 60000); } //客户端接收服务端数据时触发 _this.websocket.onmessage = function(result){ let data = eval('(' + result.data + ')'); console.info(data); let type = data.type; if(type == 1){ //send 成功或失败 } else if(type == 2){ //更新数据 let item = JSON.parse(data.data); _this.wsUpdateMsg(item); } else if(type == 3){ //多人操作不同选区("t": "mv")(用不同颜色显示其他人所操作的选区) let id = data.id; let username = data.username; let item = JSON.parse(data.data); let type = item.t, index = item.i, value = item.v; if(getObjType(value) != "array"){ value = JSON.parse(value); } if(index == Store.currentSheetIndex){//发送消息者在当前页面 let r = value[value.length - 1].row[0]; let c = value[value.length - 1].column[0]; _this.multipleRangeShow(id, username, r, c); } } else if(type == 4){ //批量指令更新 let items = JSON.parse(data.data); for(let i = 0; i < items.length; i++){ _this.wsUpdateMsg(item[i]); } } } //通信发生错误时触发 _this.websocket.onerror = function(){ _this.wxErrorCount++; if(_this.wxErrorCount > 3){ showloading("WebSocket连接发生错误, 请刷新页面!"); } else{ showloading("WebSocket连接发生错误, 请耐心等待!"); _this.openWebSocket(); } } //连接关闭时触发 _this.websocket.onclose = function(){ console.info('WebSocket连接关闭'); alert("服务器通信发生错误,请刷新页面后再试,如若不行请联系管理员!"); } } else{ alert('当前浏览器 Not Support WebSocket'); } }, wsUpdateMsg: function(item) { let type = item.t, index = item.i, value = item.v; let file = Store.luckysheetfile[getSheetIndex(index)]; if(file == null){ return; } if(type == "v"){ //单个单元格数据更新 if(file.data == null || file.data.length == 0){ return; } let r = item.r, c = item.c; file.data[r][c] = value; if(index == Store.currentSheetIndex){//更新数据为当前表格数据 Store.flowdata = file.data; //如果更新的单元格有批注 if(value != null && value.ps != null){ luckysheetPostil.buildPs(r, c, value.ps); } else{ luckysheetPostil.buildPs(r, c, null); } setTimeout(function () { luckysheetrefreshgrid(); }, 1); } } else if(type == "rv"){ //范围单元格数据更新 if(file.data == null || file.data.length == 0){ return; } let r1 = item.range.row[0], r2 = item.range.row[1]; let c1 = item.range.column[0], c2 = item.range.column[1]; for(let r = r1; r <= r2; r++){ for(let c = c1; c <= c2; c++){ file.data[r][c] = value[r - r1][c - c1]; } } if(index == Store.currentSheetIndex){//更新数据为当前表格数据 Store.flowdata = file.data; //如果更新的单元格有批注 for(let r = r1; r <= r2; r++){ for(let c = c1; c <= c2; c++){ if(value[r - r1][c - c1] != null && value[r - r1][c - c1].ps != null){ luckysheetPostil.buildPs(r, c, value[r - r1][c - c1].ps); } else{ luckysheetPostil.buildPs(r, c, null); } } } setTimeout(function () { luckysheetrefreshgrid(); }, 1); } } else if(type == "cg"){ //config更新(rowhidden,rowlen,columnlen,merge,borderInfo) let k = item.k; if(k == "borderInfo"){ file["config"]["borderInfo"] = value; } else{ if(!(k in file["config"])){ file["config"][k] = {}; } for(let key in value){ file["config"][k][key] = value[key]; } } if(index == Store.currentSheetIndex){//更新数据为当前表格数据 Store.config = file["config"]; if(k == "rowlen" || k == "columnlen" || k == "rowhidden"){ jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length); } setTimeout(function () { luckysheetrefreshgrid(); }, 1); } } else if(type == "all"){ //通用保存更新 let k = item.k; file[k] = value; if(k == "name"){ //工作表名 $("#luckysheet-sheet-container-c #luckysheet-sheets-item" + index).find("span.luckysheet-sheets-item-name").html(value); } else if(k == "color"){ //工作表颜色 let currentSheetItem = $("#luckysheet-sheet-container-c #luckysheet-sheets-item" + index); currentSheetItem.find(".luckysheet-sheets-item-color").remove(); if(value != null || value != ""){ currentSheetItem.append('
'); } } else if(k == "pivotTable"){ //PivotTable // luckysheet.pivotTable.changePivotTable(index); } else if(k == "frozen"){ //freezen row and column // tranform frozen luckysheetFreezen.frozenTofreezen(); if(index == Store.currentSheetIndex){ const _locale = locale(); const locale_freezen = _locale.freezen; if(file["freezen"].horizontal == null){ $("#luckysheet-freezen-btn-horizontal").html(' '+locale_freezen.freezenRow); luckysheetFreezen.freezenhorizontaldata = null; $("#luckysheet-freezebar-horizontal").hide(); } else{ luckysheetFreezen.createFreezenHorizontal(file["freezen"].horizontal.freezenhorizontaldata, file["freezen"].horizontal.top); } if(file["freezen"].vertical == null){ $("#luckysheet-freezen-btn-vertical").html(' '+locale_freezen.freezenColumn); luckysheetFreezen.freezenverticaldata = null; $("#luckysheet-freezebar-vertical").hide(); } else{ luckysheetFreezen.createFreezenVertical(file["freezen"].vertical.freezenverticaldata, file["freezen"].vertical.left); } luckysheetFreezen.createAssistCanvas(); } } else if(k == "filter_select"){ //筛选范围 if(index == Store.currentSheetIndex){ createFilterOptions(value); } } else if(k == "filter"){ //筛选保存 if(index == Store.currentSheetIndex){ createFilterOptions(file.filter_select, value); } } else if(k == "luckysheet_conditionformat_save"){ //条件格式 if(index == Store.currentSheetIndex){ setTimeout(function () { luckysheetrefreshgrid(); }, 1); } } else if(k == "luckysheet_alternateformat_save"){ //交替颜色 if(index == Store.currentSheetIndex){ setTimeout(function () { luckysheetrefreshgrid(); }, 1); } } else if(k == "config"){ //config if(index == Store.currentSheetIndex){ Store.config = value; jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length); } } else if(k == "dynamicArray"){ //动态数组 if(index == Store.currentSheetIndex){ setTimeout(function () { luckysheetrefreshgrid(); }, 1); } } } else if(type == "fc"){ //函数链calc let op = item.op, pos = item.pos; if(getObjType(value) != "object"){ value = eval('('+ value +')'); } let r = value.r, c = value.c; let func = value.func; let calcChain = file["calcChain"] == null ? [] : file["calcChain"]; if(op == "add"){ calcChain.push(value); } else if(op == "del"){ for(let a = 0; a < calcChain.length; a++){ if(r == calcChain[a].r && c == calcChain[a].c && index == calcChain[a].index){ calcChain.splice(a, 1); } } } else if(op == "update"){ for(let a = 0; a < calcChain.length; a++){ if(r == calcChain[a].r && c == calcChain[a].c && index == calcChain[a].index){ calcChain[a].func = func; } } } setTimeout(function () { luckysheetrefreshgrid(); }, 1); } else if(type == "drc"){ //删除行列 if(file.data == null || file.data.length == 0){ return; } let rc = item.rc, st_i = value.index, len = value.len, mc = value.mc, borderInfo = value.borderInfo; let data = file.data; if(rc == "r"){ file["row"] -= len; data.splice(st_i, len); //空白行模板 let row = []; for (let c = 0; c < data[0].length; c++) { row.push(null); } //删除多少行,增加多少行空白行 for (let r = 0; r < len; r++) { data.push(row); } } else{ file["column"] -= len; //空白列模板 let addcol = []; for (let r = 0; r < len; r++) { addcol.push(null); } for(let i = 0; i < data.length; i++){ data[i].splice(st_i, len); data[i] = data[i].concat(addcol); } } for(let x in mc){ let r = mc[x].r, c = mc[x].c; data[r][c].mc = mc[x]; } file["config"].merge = mc; file["config"].borderInfo = borderInfo; if(index == Store.currentSheetIndex){ Store.flowdata = data; Store.config["merge"] = mc; Store.config["borderInfo"] = borderInfo; setTimeout(function () { luckysheetrefreshgrid(); }, 1); } } else if(type == "arc"){ //增加行列 if(file.data == null || file.data.length == 0){ return; } let rc = item.rc, st_i = value.index, len = value.len, addData = value.data, mc = value.mc, borderInfo = value.borderInfo; let data = file.data; if(rc == "r"){ file["row"] += len; let arr = []; for(let i = 0; i < len; i++){ arr.push(JSON.stringify(addData[i])); } eval('data.splice(' + st_i + ', 0, ' + arr.join(",") + ')'); } else{ file["column"] += len; for(let i = 0; i < data.length; i++){ data[i].splice(st_i, 0, addData[i]); } } for(let x in mc){ let r = mc[x].r, c = mc[x].c; data[r][c].mc = mc[x]; } file["config"].merge = mc; file["config"].borderInfo = borderInfo; if(index == Store.currentSheetIndex){ Store.flowdata = data; Store.config["merge"] = mc; Store.config["borderInfo"] = borderInfo; setTimeout(function () { luckysheetrefreshgrid(); }, 1); } } else if(type == "f"){ //筛选 let op = item.op, pos = item.pos; let filter = file.filter; if(filter == null){ filter = {}; } if(op == "upOrAdd"){ filter[pos] = value; } else if(op == "del"){ delete filter[pos]; } if(index == Store.currentSheetIndex){ createFilterOptions(file.filter_select, filter); } } else if(type == "fsc"){ //清除筛选 file.filter = null; file.filter_select = null; if(index == Store.currentSheetIndex){ $('#luckysheet-filter-selected-sheet' + Store.currentSheetIndex + ', #luckysheet-filter-options-sheet' + Store.currentSheetIndex).remove(); $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide(); } } else if(type == "fsr"){ //恢复筛选 file.filter = value.filter; file.filter_select = value.filter_select; if(index == Store.currentSheetIndex){ createFilterOptions(file.filter_select, file.filter); } } else if(type == "sha"){ //新建sheet Store.luckysheetfile.push(value); let colorset = ''; if(value.color != null){ colorset = '
'; } $("#luckysheet-sheet-container-c").append(replaceHtml(sheetHTML, { "index": value.index, "active": "", "name": value.name, "style": "", "colorset": colorset })); $("#luckysheet-cell-main").append('
'); } else if(type == "shc"){ //复制sheet let copyindex = value.copyindex, name = value.name; let copyarrindex = getSheetIndex(copyindex); let copyjson = $.extend(true, {}, Store.luckysheetfile[copyarrindex]); copyjson.index = index; copyjson.name = name; Store.luckysheetfile.splice(copyarrindex + 1, 0, copyjson); let copyobject = $("#luckysheet-sheets-item" + copyindex); $("#luckysheet-sheet-container-c").append(replaceHtml(sheetHTML, { "index": copyjson.index, "active": "", "name": copyjson.name, "style": "", "colorset": "" })); $("#luckysheet-sheets-item" + copyjson.index).insertAfter(copyobject); $("#luckysheet-cell-main").append('
'); } else if(type == "shd"){ //删除sheet for(let i = 0; i < Store.luckysheetfile.length; i++){ if(Store.luckysheetfile[i].index == value.deleIndex){ server.sheetDeleSave.push(Store.luckysheetfile[i]); Store.luckysheetfile.splice(i, 1); break; } } $("#luckysheet-sheets-item" + value.deleIndex).remove(); $("#luckysheet-datavisual-selection-set-" + value.deleIndex).remove(); } else if(type == "shr"){ //sheet位置 for(let x in value){ Store.luckysheetfile[getSheetIndex(x)].order = value[x]; } } else if(type == "shre"){ //删除sheet恢复操作 for(let i = 0; i < server.sheetDeleSave.length; i++){ if(server.sheetDeleSave[i].index == value.reIndex){ let datav = server.sheetDeleSave[i]; Store.luckysheetfile.push(datav); let colorset = ''; if(value.color != null){ colorset = '
'; } $("#luckysheet-sheet-container-c").append(replaceHtml(sheetHTML, { "index": datav.index, "active": "", "name": datav.name, "style": "", "colorset": colorset })); $("#luckysheet-cell-main").append('
'); break; } } } else if(type == "sh"){ //隐藏sheet let op = item.op, cur = item.cur; if(op == "hide"){ file.hide = 1; $("#luckysheet-sheets-item" + index).hide(); if(index == Store.currentSheetIndex){ $("#luckysheet-sheets-item" + cur).addClass("luckysheet-sheets-item-active"); sheetmanage.changeSheetExec(cur); } } else if(op == "show"){ file.hide = 0; $("#luckysheet-sheets-item" + index).show(); } } else if(type == "c"){ //图表操作 let op = item.op, cid = item.cid; if(op == "add"){ //插入 file.chart.push(value); luckysheet.insertChartTosheet(value.sheetIndex, value.dataSheetIndex, value.option, value.chartType, value.selfOption, value.defaultOption, value.row, value.column, value.chart_selection_color, value.chart_id, value.chart_selection_id, value.chartStyle, value.rangeConfigCheck, value.rangeRowCheck, value.rangeColCheck, value.chartMarkConfig, value.chartTitleConfig, value.winWidth, value.winHeight, value.scrollLeft1, value.scrollTop1, value.chartTheme, value.myWidth, value.myHeight, value.myLeft, value.myTop, value.myindexrank1, true); } else if(op == "xy" || op == "wh" || op == "update"){ //移动 缩放 更新 for(let i = 0; i < file.chart.length; i++){ let chartjson = file.chart[i]; if(chartjson.chart_id == cid){ for(let item in chartjson){ for(let vitem in value){ if(item == vitem){ chartjson[item] = value[vitem]; } } } sheetmanage.saveChart(chartjson); return; } } } else if(op == "del"){ //删除 for(let i = 0; i < file.chart.length; i++){ let chartjson = file.chart[i]; if(chartjson.chart_id == cid){ file.chart.splice(i, 1); $("#" + cid).remove(); sheetmanage.delChart($("#" + cid).attr("chart_id"), $("#" + cid).attr("sheetIndex")); return; } } } } else if(type == "na"){ //表格名称 $("#luckysheet_info_detail_input").val(value).css("width", getByteLen(value) * 10); } }, multipleIndex: 0, multipleRangeShow: function(id, name, r, c) { let _this = this; let r1 = r2 = r; let c1 = c2 = c; let row = visibledatarow[r2], row_pre = r1 - 1 == -1 ? 0 : visibledatarow[r1 - 1], col = visibledatacolumn[c2], col_pre = c1 - 1 == -1 ? 0 : visibledatacolumn[c1 - 1]; let margeset = menuButton.mergeborer(Store.flowdata, r1, c1); if(!!margeset){ row = margeset.row[1]; row_pre = margeset.row[0]; col = margeset.column[1]; col_pre = margeset.column[0]; } if($("#luckysheet-multipleRange-show-" + id).length > 0){ $("#luckysheet-multipleRange-show-" + id).css({ "position": "absolute", "left": col_pre - 1, "width": col - col_pre - 1, "top": row_pre - 1, "height": row - row_pre - 1 }); } else{ let itemHtml = '
'+ '
'+ '
'; $(itemHtml).appendTo($("#luckysheet-cell-main #luckysheet-multipleRange-show")); _this.multipleIndex++; } }, sheetDeleSave: [], //共享编辑模式下 删除的sheet保存下来,方便恢复时取值 submitInterval: 1000, imagesubmitInterval: 5000, submitdatalimit: 50, submitcompresslimit: 1000, checksubmit: function(data){ let _this = this; //clearTimeout(_this.requestTimeOut); _this.submitTimeout(); clearTimeout(_this.imageRequestTimeout); _this.imageRequestTimeout = setTimeout(function(){ _this.imageRequest(); }, _this.imagesubmitInterval); }, submitTimeout: function(){ let _this = this; clearTimeout(_this.requestTimeOut); //console.log(_this.requestlast, moment(), (_this.requestlast!=null && _this.requestlast.add(10, 'seconds').isBefore(moment()) ) ); if(!_this.requestLock && (_this.requestlast!=null && _this.requestlast.clone().add(1, 'seconds').isBefore(moment()) ) ){ _this.request(); } // if(!_this.imageRequestLock && (_this.imageRequestLast==null || _this.imageRequestLast.clone().add(30, 'seconds').isBefore(moment()) ) ){ // } _this.requestTimeOut = setTimeout(function(){ _this.submitTimeout(); }, _this.submitInterval); }, requestLock: false, requestlast: null, firstchange: true, requestTimeOut: null, request: function () { let _this = this; let key = this.gridKey; let cahce_key = key + "__qkcache"; _this.cachelocaldata(function(cahce_key, params){ if(params.length==0){ return; } console.log(params); params = encodeURIComponent(JSON.stringify(params)); let compressBeginLen = params.length; let iscommpress = false; // if (compressBeginLen > _this.submitcompresslimit) { // params = pako.gzip(params, { to: "string" }); // iscommpress = true; // } _this.requestLock = true; //console.log(params); console.log("request"); if(_this.updateUrl != ""){ $.post(_this.updateUrl, { compress: iscommpress, gridKey: _this.gridKey, data: params }, function (data) { let re = eval('('+ data +')') if(re.status){ $("#luckysheet_info_detail_update").html("最近存档时间:"+ moment().format("M-D H:m:s")); $("#luckysheet_info_detail_save").html("同步成功"); _this.clearcachelocaldata(); } else{ $("#luckysheet_info_detail_save").html("同步失败"); _this.restorecachelocaldata(); } _this.requestlast = moment(); _this.requestLock = false; }); } }); }, imageRequestLast: null, imageRequestLock: false, imageRequestTimeout: null, imageRequest: function(){ let _this = this; html2canvas($("#" + container).find(".luckysheet-grid-window").get(0), { onrendered: function(canvas) { //let imgcut = $("#luckysheet-cell-main").find(".luckysheet-grid-window"); //document.body.appendChild(canvas); let old = $(canvas).appendTo("body"); old.hide(); let newwidth = old.width(); let newheight = old.height(); let imageData = old.get(0).getContext("2d").getImageData(0, 0, newwidth, newheight); let cutW = newwidth, cutH = newheight; if(cutW*0.54 > cutH){ cutW = cutH / 0.54; } else{ cutH = cutW * 0.54; } let newCanvas = $("").attr("width", cutW).attr("height", cutH)[0]; newCanvas.getContext("2d").putImageData(imageData, 0, 0); old.attr("width", 350); old.attr("height", 189); old.get(0).getContext("2d").drawImage(newCanvas, 0, 0, 350, 189); let base64 = old.get(0).toDataURL('image/jpeg', 0.9); //console.log(base64); //console.log("压缩:", pako.gzip(base64, { to: "string" })); //console.log("imageRequest"); let curindex = luckysheet.sheetmanage.getCurSheetnoset(); _this.imageRequestLock =true; // let data1 = pako.gzip(encodeURIComponent(JSON.stringify({"t":"thumb", "img": base64, "curindex":curindex })), { to: "string" }); let data1 = encodeURIComponent(JSON.stringify({"t":"thumb", "img": base64, "curindex":curindex })); old.remove(); //console.log("缩略图", _this.imageRequestLast,base64); if(_this.updateImageUrl != ""){ // $.post(_this.updateImageUrl, { compress: true, gridKey: _this.gridKey, data:data1 }, function (data) { $.post(_this.updateImageUrl, { compress: false, gridKey: _this.gridKey, data:data1 }, function (data) { let re = eval('('+ data +')') if(re.status){ imageRequestLast = moment(); } else{ $("#luckysheet_info_detail_save").html("网络不稳定"); } _this.imageRequestLock =true; }); } } }); }, localdata: [], matchOpt: function(v, d){ for(let vitem in v){ if(vitem == "t" && v["t"] in {"drc":1, "arc":1,"sha":1,"shc":1,"shd":1 } ){ return false; } if(vitem=="v"){ continue; } if(!(vitem in d)){ return false; } if(d[vitem] != v[vitem]){ return false; } } return true; }, deleteRepeatOpt: function(data, value){ //let d = $.extend(true, [], data); //原来 let d = data; let _this = this; if(value instanceof Array){ for(let i = 0; i < value.length; i++){ let vitem = value[i]; for(let a = 0; a < d.length; a++){ let ditem = data[i]; //let ditem = data[a];? if(_this.matchOpt(vitem, ditem)){ delete d[a]; } } } } else{ for(let a = 0; a < d.length; a++){ let ditem = d[a]; if(_this.matchOpt(value, ditem)){ delete d[a]; } } } let ret = []; for(let i = 0; i < d.length; i++){ if(d[i] != null){ ret.push(d[i]); } } return ret; }, setlocaldata: function (value, func) { let key = this.gridKey; //store.push(key, data); let _this = this; _this.getlocaldata(function(data){ if(data==null){ data = []; } //此处不去重,在request同步后台时统一循环一次去重 //let data = _this.deleteRepeatOpt(data, value); if(value instanceof Array){ data = data.concat(value); } else{ data.push(value); } _this.localdata = data; func(_this.localdata); //console.log(value); // localforage.setItem(key, data).then(function () { // console.log(data); // func(data); // }).catch(function (err) { // }); }); }, getlocaldata: function (func) { let key = this.gridKey; //return store.get(key); func(this.localdata); // localforage.getItem(key).then(function(readValue) { // func(readValue); // }); }, clearlocaldata: function (func) { let key = this.gridKey; //store.remove(key); this.localdata = []; func(); // localforage.removeItem(key, function(err,value) { // func(); // }); }, cachelocaldata: function (func) { let key = this.gridKey; let _this = this; let cahce_key = key + "__qkcache"; //store.remove(key); //console.log(key, cahce_key); //处理localdata去重 let updatedata = _this.localdata; let uLen = updatedata.length; if(uLen > 1){ let prevData = []; prevData[0] = updatedata[0]; for(let i = 1; i < uLen; i++){ let value = updatedata[i]; let flag = true; for(let a=0;a