找回密码
 立即注册

QQ登录

只需一步,快速开始

李大大

注册会员

4

主题

17

帖子

47

积分

注册会员

积分
47
最新发帖
李大大
注册会员   /  发表于:2017-7-10 11:11  /   查看:6470  /  回复: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 个回复

倒序浏览
李大大
注册会员   /  发表于:2017-7-10 11:20:33
沙发
有管理大大来给看看什么问题吗?
回复 使用道具 举报
李大大
注册会员   /  发表于:2017-7-10 14:30:15
板凳
不要沉~~~
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-7-10 14:54:17
地板

您好,看了您提供的关键代码,写法上应该是没什么问题的。但是其他信息不是很明确,主要怀疑是您切换时候的操作,以及getDataModel方法中做的操作原因导致,您最好能提供一个重现问题的demo,不然我们这边凭借仅存的信息也只能进行猜测。
回复 使用道具 举报
李大大
注册会员   /  发表于:2017-7-10 16:25:05
5#
ClarkPan 发表于 2017-7-10 14:54
您好,看了您提供的关键代码,写法上应该是没什么问题的。但是其他信息不是很明确,主要怀疑是您切换时候 ...

你好,切换是没有问题的,关闭之前的也不会出现问题,只有关闭刚打开的,再点击之前的才会出现问题。因为我们是将它进行封装使用,具体可运行demo无发提供。跟踪发现sheet对象缺少值导致。
关闭的时候会执行销毁操作。是不是跟这个有关系?
/**
         * 销毁当前Spread
         */
        public void destroy(){
                if(!singleSpread.equals("1"))
                        destroySpread(getSpread());
                else{
                        reSetSingleSpreadDiv();
                }
        }
       
        public native void destroySpread(JavaScriptObject spread) /*-{
                if(spread == null){
                        return;
                }
                spread.destroy();
        }-*/;
       
回复 使用道具 举报
李大大
注册会员   /  发表于:2017-7-10 16:31:45
6#
这个错误是min.js里面的
无标题.png
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-7-10 16:32:53
7#
李大大 发表于 2017-7-10 16:25
你好,切换是没有问题的,关闭之前的也不会出现问题,只有关闭刚打开的,再点击之前的才会出现问题。因为 ...

应该是这里的问题,因为destroy掉对象后,重新切换会对象时需要将对象的所有事件全部重新绑定,之前您在sheet上绑定了CellClick事件,destroy后重新切换回来是需要重新绑定的(因为destroy spread 后sheet都没了,上面的事件肯定也没有了)。
回复 使用道具 举报
李大大
注册会员   /  发表于:2017-7-10 17:18:30
8#
ClarkPan 发表于 2017-7-10 16:32
应该是这里的问题,因为destroy掉对象后,重新切换会对象时需要将对象的所有事件全部重新绑定,之前您在s ...

但是我销毁的只是我关闭掉的spread。
按照打开的顺序123关闭,不会出问题,按照321顺序关闭才会出错。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-7-10 18:05:49
9#
李大大 发表于 2017-7-10 17:18
但是我销毁的只是我关闭掉的spread。
按照打开的顺序123关闭,不会出问题,按照321顺序关闭才会出错。

那您getSpread()的方法中是否确保各自打开的spread互相独立。这里的代码能否提供下,还有就是您各个spread初始化的代码也请提供。感觉可能是您的spread对象之间引用混乱造成。
回复 使用道具 举报
李大大
注册会员   /  发表于: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());添加监听,即本帖第一个方法代码。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部