spreadjs666 发表于 2024-11-13 20:39:11

【v17】fromJSON后调用showColumn、scroll不生效

本帖最后由 Wilson.Zhang 于 2024-11-28 10:32 编辑

const designer = new GC.Spread.Sheets.Designer.Designer(document.getElementById("gc-designer-container"));
const spread = designer.getWorkbook();
const sheet = spread.getActiveSheet();
spread.options.scrollByPixel = true;
spread.options.scrollbarShowMax = true;
spread.options.scrollbarMaxAlign = true;
spread.options.allowExtendPasteRange = true;

如附件所示,在官网中执行以上代码,并将行宽拖宽,滚动后,执行formJSON + showCell, 第一次有偏差,第二次才生效。
场景:在数据协同过程中,保重用户的视图不产生位移,fromJSON,会导致试图重新定位,因此需要使用showCell和scroll进行还原
此问题为线上问题,因此希望能尽快给出解决方案,感谢

PS:帖子编辑有bug,代码补充在结尾了:
spread.suspendPaint();
spread.suspendEvent();
spread.fromJSON(spread.toJSON())
// 模拟定位到fromJSON前的单元格
spread.getActiveSheet().showCell(0,3,'top', 'left')
// 模拟定位到fromJSON前的单元格的偏移量
spread.getActiveSheet().scroll(0,100);
spread.resumePaint();
spread.resumeEvent();



产品:SpreadJS
版本:17.1.9
调研编号:SJS-27356
Last Review:2024-11-28
当前进展:计划在18版本修复。

Lynn.Dou 发表于 2024-11-14 15:11:28

本帖最后由 Lynn.Dou 于 2024-11-14 15:12 编辑

您好,
您代码中写了 spread.getActiveSheet().scroll(0,100),但是我看视频中并没有执行。
请将视频中第二段代码修改如下,测试看问题是否解决:
//获取偏移值
const topRowOffset = sheet.getViewportTopRowOffset();
const leftColumnOffset = sheet.getViewportLeftColumnOffset();
spread.suspendPaint();
spread.suspendEvent();
spread.fromJSON(spread.toJSON())
// 模拟定位到fromJSON前的单元格
spread.getActiveSheet().showCell(0,3,GC.Spread.Sheets.VerticalPosition.top, GC.Spread.Sheets.HorizontalPosition.left)
spread.resumeEvent();
spread.resumePaint();
// 模拟定位到fromJSON前的单元格的偏移量,需注意要放在paint之后执行
spread.getActiveSheet().scroll(topRowOffset,leftColumnOffset);

spreadjs666 发表于 2024-11-14 16:20:42

Lynn.Dou 发表于 2024-11-14 15:11
您好,
您代码中写了 spread.getActiveSheet().scroll(0,100),但是我看视频中并没有执行。
请将视频中第 ...

您好,采用您给出的代码之后,发现还是无法按照预期执行:
const designer = new GC.Spread.Sheets.Designer.Designer(document.getElementById("gc-designer-container"));
const spread = designer.getWorkbook();
const sheet = spread.getActiveSheet();
spread.options.scrollByPixel = true;
spread.options.scrollbarShowMax = true;
spread.options.scrollbarMaxAlign = true;
spread.options.allowExtendPasteRange = true;
function fromJSONFn () {
try {
    let sheet = spread.getActiveSheet();
    const row = sheet.getViewportTopRow(1,1)
    const col = sheet.getViewportLeftColumn(1,1)
       //获取偏移值
    const topRowOffset = sheet.getViewportTopRowOffset();
    const leftColumnOffset = sheet.getViewportLeftColumnOffset();
    spread.suspendPaint();
    spread.suspendEvent();
    spread.fromJSON(spread.toJSON())
    // 模拟定位到fromJSON前的单元格
    spread.getActiveSheet().showCell(row,col,GC.Spread.Sheets.VerticalPosition.top, GC.Spread.Sheets.HorizontalPosition.left)
    spread.resumeEvent();
    spread.resumePaint();
    // 模拟定位到fromJSON前的单元格的偏移量,需注意要放在paint之后执行
    spread.getActiveSheet().scroll(topRowOffset,leftColumnOffset);
} catch (err) {
    console.log(err);
}
}调用fromJSONFn();页面还是未符合跳转预期

Richard.Ma 发表于 2024-11-14 17:52:31

收到,我们再调查一下看看

spreadjs666 发表于 2024-11-15 10:59:55

Richard.Ma 发表于 2024-11-14 17:52
收到,我们再调查一下看看

好的,线上问题,麻烦尽快,十分感谢

Lynn.Dou 发表于 2024-11-15 12:28:26

从您此前提供的视频来看,您期待的效果应是视图聚焦在cell(0,3)上,而不会产生偏移。
所以前面提到的方案,是模拟的视频中在控制台执行代码,测试是可以的。

不过,如果不通过控制台,而是在demo中通过代码执行,直接showCell就可以恢复cell(0,3)视图(不需要scroll),不会有偏移。所以这种差异应是受打开控制台对视图造成了影响导致的。
我整理了一个测试demo,您可以点击按钮看下效果,看在您的项目中直接执行showCell是否可以满足预期。

如果我的理解有偏差,您留下联系方式,我们电话沟通下。

Lynn.Dou 发表于 2024-11-15 16:56:38

根据沟通的需求,重新调整了demo,您参考下。(完整代码见附件)
注:demo中监听了TopRowChanged、LeftColumnChanged事件来记录当前视图的单元格信息,以便后续恢复。
function events(sheet) {
                sheet.bind(GC.Spread.Sheets.Events.TopRowChanged, function (sender, args) {
                  console.log(args);
                  rowOffset = args.newOffset;
                  newRow = args.newTopRow;
                });
                sheet.bind(GC.Spread.Sheets.Events.LeftColumnChanged, function (sender, args) {
                  console.log(args);
                  columnOffset = args.newOffset;
                  newColumn = args.newLeftCol;
                });
            }

spreadjs666 发表于 2024-11-15 17:57:23

Lynn.Dou 发表于 2024-11-15 16:56
根据沟通的需求,重新调整了demo,您参考下。(完整代码见附件)
注:demo中监听了TopRowChanged、LeftCol ...

您好,您的demo是符合预期的。
但经排查,我们使用了spread.options.scrollbarAppearance = GC.Spread.Sheets.ScrollbarAppearance.mobile;
,一旦使用此属性,您给的demo也产生了不符合预期的情况,
我们为了用户的视觉体验使用了GC.Spread.Sheets.ScrollbarAppearance.mobile,因此期望能给出一个可以共存的可行方案,十分感谢。

Lynn.Dou 发表于 2024-11-18 10:50:14

本帖最后由 Lynn.Dou 于 2024-11-18 14:45 编辑

好的,我再结合您提供的信息调研下,有结果贴中同步。(SJS-27356)

spreadjs666 发表于 2024-11-19 10:51:01

Lynn.Dou 发表于 2024-11-18 10:50
好的,我再结合您提供的信息调研下,有结果贴中同步。(SJS-27356)

请问有进展了吗?
页: [1] 2
查看完整版本: 【v17】fromJSON后调用showColumn、scroll不生效