找回密码
 立即注册

QQ登录

只需一步,快速开始

李大大

注册会员

4

主题

17

帖子

47

积分

注册会员

积分
47
最新发帖
李大大
注册会员   /  发表于:2017-7-10 11:11  /   查看:6539  /  回复:14
本帖最后由 李大大 于 2017-7-19 17:18 编辑

联系方式:
产品版本: gcspread.sheets.all.9.40
浏览器版本: chrome 58.0.3029.81 (64-bit)
问题描述:打开多个创建的标签页,关闭最后打开的一个,点击之前标签页的单元格报错。sheet对象不正确了,sheet.getValue()方法报错。
关键代码:
  1. /**
  2.          * 添加cell click监听事件
  3.          * @param id
  4.          */
  5.         public native void addCellClickListener(JavaScriptObject spread) /*-{
  6.                 var $ = $wnd.$;
  7.                 sheet=spread.getActiveSheet();
  8.                
  9.                 var app=this;
  10.                 sheet.bind($.wijmo.wijspread.Events.CellClick, function (sender, args) {
  11.                         if(args.sheetArea === $.wijmo.wijspread.SheetArea.colHeader){
  12.                             return;
  13.                         }
  14.                         
  15.                         if(args.sheetArea === $.wijmo.wijspread.SheetArea.rowHeader){
  16.                             return;
  17.                         }
  18.                         
  19.                         if(args.sheetArea === $.wijmo.wijspread.SheetArea.corner){
  20.                             return;
  21.                         }
  22.                         
  23.                         console.log("Clicked column index: " + args.col);
  24.                         console.log("Clicked row index: " + args.row);
  25.                         console.log("Clicked cell value: " + sheet.getValue(args.row,args.col));
  26.                         if(args.col== undefined || args.row==undefined){
  27.                                 return;
  28.                         }
  29.                         app.@com.pansoft.query.comp.QueryView::processCellClickScript(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)(args.row,args.col,sheet.getValue(args.row,args.col));
  30.                 });
  31.                
  32.         }-*/;
复制代码


使用截图:单个页面点击截图 image.png780174560.png
屏幕录像:请查阅附件
错误代码:
gcspread.sheets.all.9.40.20171.0.min.js:22420 Uncaught TypeError: Cannot read property 'getDataModel' of null    at l._getModel (http://127.0.0.1:8080/OSPServer/ ... 1.0.min.js:22420:35)    at l.getValue (http://127.0.0.1:8080/OSPServer/ ... 1.0.min.js:19831:69)    at HTMLInputElement.<anonymous> (GWTEnterprise-0.js:601145:48)    at HTMLInputElement.s (http://127.0.0.1:8080/OSPServer/ ... 0171.0.min.js:36:17)    at http://127.0.0.1:8080/OSPServer/ ... 0171.0.min.js:89:95    at Array.forEach (native)    at trigger (http://127.0.0.1:8080/OSPServer/ ... 0171.0.min.js:78:23)    at rt.trigger (http://127.0.0.1:8080/OSPServer/ ... 1.0.min.js:15423:58)    at l._trigger (http://127.0.0.1:8080/OSPServer/ ... 1.0.min.js:25132:39)    at l.triggerCellClick (http://127.0.0.1:8080/OSPServer/ ... 1.0.min.js:25138:10)
l._getModel@gcspread.sheets.all.9.40.20171.0.min.js:22420
l.getValue@gcspread.sheets.all.9.40.20171.0.min.js:19831
(anonymous)@GWTEnterprise-0.js:601145
s@gcspread.sheets.all.9.40.20171.0.min.js:36
(anonymous)@gcspread.sheets.all.9.40.20171.0.min.js:89
trigger@gcspread.sheets.all.9.40.20171.0.min.js:78
rt.trigger@gcspread.sheets.all.9.40.20171.0.min.js:15423
l._trigger@gcspread.sheets.all.9.40.20171.0.min.js:25132
l.triggerCellClick@gcspread.sheets.all.9.40.20171.0.min.js:25138
rt.doMouseUpImp@gcspread.sheets.all.9.40.20171.0.min.js:14868
rt.doMouseUp@gcspread.sheets.all.9.40.20171.0.min.js:14846
(anonymous)@gcspread.sheets.all.9.40.20171.0.min.js:12924
s@gcspread.sheets.all.9.40.20171.0.min.js:36








错误截图.gif

14 个回复

正序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-7-12 16:27:10
15#
李大大 发表于 2017-7-12 16:21
非常感谢技术人员的支持。经过测试发现使我们使用上的问题。图中的sheet没用声明,变全局变量了。问题已 ...

不客气,有什么问题欢迎发帖进行询问。
回复 使用道具 举报
李大大
注册会员   /  发表于:2017-7-12 16:21:48
14#
ClarkPan 发表于 2017-7-11 14:07
不进行destroy打开的会占用内存无法释放,打开多了可能会出现内存被占满的问题

非常感谢技术人员的支持。经过测试发现使我们使用上的问题。图中的sheet没用声明,变全局变量了。问题已解决。
QQ截图20170712161840.png
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-7-11 14:07:10
13#
李大大 发表于 2017-7-11 13:45
如果不进行destroy会有什么问题?

不进行destroy打开的会占用内存无法释放,打开多了可能会出现内存被占满的问题
回复 使用道具 举报
李大大
注册会员   /  发表于:2017-7-11 13:45:02
12#
ClarkPan 发表于 2017-7-11 11:34
看了以上代码,表面上没看出什么问题,因为只有代码片段,而且您这边提供不了重现问题的demo,并且重现问 ...

如果不进行destroy会有什么问题?
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-7-11 11:34:23
11#
李大大 发表于 2017-7-11 09:47
加载数据的时候会走buildView方法。通过initExcel方法创建并返回spread对象。this.setSpread(spreadObj); ...

看了以上代码,表面上没看出什么问题,因为只有代码片段,而且您这边提供不了重现问题的demo,并且重现问题的步骤也很笼统,所以很难定位问题,这样,您试试逐步注释要无关逻辑的代码,当剩下核心相关逻辑时,再进行逐行注释排查问题,这样能得到具体的一些问题信息,然后发给我们,我们也能够尽快重现问题。
回复 使用道具 举报
李大大
注册会员   /  发表于:2017-7-11 09:47:14
10#
ClarkPan 发表于 2017-7-10 18:05
那您getSpread()的方法中是否确保各自打开的spread互相独立。这里的代码能否提供下,还有就是您各个sprea ...
  1. public native JavaScriptObject initExcel(String id, String strJSon,int count,String frozenColor) /*-{
  2.                 var $ = $wnd.$;
  3.                 var ss = "#"+id;
  4.                 $(ss).wijspread({sheetCount:count}); // create wijspread control
  5.             var spread = $(ss).wijspread("spread"); // get instance of wijspread control
  6.             
  7.             //挂起绘制
  8.                 spread.isPaintSuspended(true);
  9.             
  10.             spread.fromJSON(JSON.parse(strJSon));
  11.             spread.tabStripVisible(true);
  12.             spread.grayAreaBackColor("white");
  13.             var sheet = spread.getActiveSheet();
  14.             sheet.setGridlineOptions({
  15.                     color: "#D9D9D9",
  16.                     showVerticalGridline:false,
  17.                     showHorizontalGridline:false
  18.             });
  19.             sheet.frozenlineColor(frozenColor);
  20.                 return spread;
  21.         }-*/;
复制代码
  1. private void buildView(){
  2.                 String strJSon="";
  3.                 if(formatData.length==2){
  4.                         strJSon=getExcelFormatAndDataJson(formatData);
  5.                 }else if(formatData.length==3 || formatData.length==4){
  6.                         String[] newFormatData={formatData[1],formatData[2]};
  7.                         strJSon=getExcelFormatAndDataJson(newFormatData);
  8.                 }else if(formatData.length==5 || formatData.length==6){
  9.                         strJSon=showBNBQData(this.QO,formatData);
  10.                 }
  11.                
  12.                 if(strJSon==null || strJSon.equals("")){
  13.                         return;
  14.                 }
  15.                 this.viewJson=strJSon;
  16.                
  17.                 JavaScriptObject spreadObj=null;
  18.                 String ldtype=this.PO.getString("ldtype", "init");
  19.                 if(ldtype.equals("init")){
  20.                         spreadObj=initExcel(this.getViewId(),strJSon,1,frozenLineColor);
  21.                 }else if(ldtype.equals("refresh")){
  22.                         spreadObj=initExcelData(this.getViewId(),strJSon,1,frozenLineColor);
  23.                 }
  24.                 this.setSpread(spreadObj);

  25.                 //设置锁定列
  26.                 int fccount=0;
  27.                 if(this.frozenColCount!=null && this.frozenColCount.trim().length()>0){
  28.                         fccount=Integer.parseInt(this.frozenColCount);
  29.                 }
  30.                 initExcelLockColumn(this.getSpread(),fccount);
  31.                
  32.                 //设置分级
  33.                 initExcelGroup(this.getSpread(),0);
  34.                
  35.                 if(hideRowHeader){
  36.                         this.hideRowHeader(this.getSpread());
  37.                 }
  38.                 if(hideColHeader){
  39.                         this.hideColHeader(this.getSpread());
  40.                 }
  41.                
  42.                 if(!hideFooter){
  43.                         this.hideFooter(this.getSpread());
  44.                 }
  45.                 String hideScroll=this.PO.getString("hideScroll", "");
  46.                 if(hideScroll.equals("1")){
  47.                         hideHorizontalScrollbar(this.getSpread());
  48.                         hideVerticalScrollbar(this.getSpread());
  49.                 }
  50.                
  51.                
  52.                 //设置超链接样式
  53.                 if(linkQueryCols!=null && linkQueryCols.trim().length()>0){
  54.                         String lkCol[]=linkQueryCols.split(",");
  55.                         for(int c=0;c<lkCol.length;c++){
  56.                                 int hcolIndex=Integer.parseInt(lkCol[c]);
  57.                                 setHyperlinkStyle(this.getSpread(),0,this.titleNum+this.headerNum,hcolIndex,"#0000FF");
  58.                         }
  59.                 }
  60.                 addCellClickListener(this.getSpread());
  61.                
  62.                 processSameContentSpan();//处理相同内容是否合并
  63.                
  64.                 setProtectCell(this.getSpread());
  65.                 setAutoFitRow(this.getSpread());
  66.                 //激活重新绘制
  67.                 suspendPaint(this.getSpread(),false);
  68.         }
复制代码
加载数据的时候会走buildView方法。通过initExcel方法创建并返回spread对象。this.setSpread(spreadObj);将spread对象放入。addCellClickListener(this.getSpread());添加监听,即本帖第一个方法代码。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-7-10 18:05:49
9#
李大大 发表于 2017-7-10 17:18
但是我销毁的只是我关闭掉的spread。
按照打开的顺序123关闭,不会出问题,按照321顺序关闭才会出错。

那您getSpread()的方法中是否确保各自打开的spread互相独立。这里的代码能否提供下,还有就是您各个spread初始化的代码也请提供。感觉可能是您的spread对象之间引用混乱造成。
回复 使用道具 举报
李大大
注册会员   /  发表于:2017-7-10 17:18:30
8#
ClarkPan 发表于 2017-7-10 16:32
应该是这里的问题,因为destroy掉对象后,重新切换会对象时需要将对象的所有事件全部重新绑定,之前您在s ...

但是我销毁的只是我关闭掉的spread。
按照打开的顺序123关闭,不会出问题,按照321顺序关闭才会出错。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-7-10 16:32:53
7#
李大大 发表于 2017-7-10 16:25
你好,切换是没有问题的,关闭之前的也不会出现问题,只有关闭刚打开的,再点击之前的才会出现问题。因为 ...

应该是这里的问题,因为destroy掉对象后,重新切换会对象时需要将对象的所有事件全部重新绑定,之前您在sheet上绑定了CellClick事件,destroy后重新切换回来是需要重新绑定的(因为destroy spread 后sheet都没了,上面的事件肯定也没有了)。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部