You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle Apex交互式网格搜索后选中记录无法持久化问题求助

Oracle Apex Interactive Grid 搜索后保持选中记录持久化的解决方案

默认的persistSelection: true仅支持分页时的选中状态保留,无法覆盖搜索/过滤场景,以下是两种可行的自定义实现方案:

方案一:通过页面项持久化选中主键

步骤1:创建隐藏页面项

新建一个隐藏类型的页面项(例如P1_SELECTED_IDS),用于存储选中行的主键值,格式为逗号分隔的字符串。

步骤2:监听行选择事件,更新页面项

在Interactive Grid的JavaScript初始化代码中添加以下逻辑,每次选中状态变化时更新页面项:

function(options) {
    options.defaultGridViewOptions = {
        persistSelection: true
    };

    const ig = apex.region(options.regionId).widget().interactiveGrid("getViews", "grid");
    const pkField = ig.model.getFieldKey("ID"); // 替换为你的主键列名

    // 监听行选择变化事件
    ig.on("selectionchange", function() {
        const selectedIds = ig.getSelectedRecords().map(record => record[pkField]).join(",");
        apex.item("P1_SELECTED_IDS").setValue(selectedIds);
    });

    return options;
}

步骤3:刷新后恢复选中状态

添加一个动态动作,触发时机选择「Interactive Grid 刷新后」,执行以下JavaScript代码:

const ig = apex.region("YOUR_IG_STATIC_ID").widget().interactiveGrid("getViews", "grid"); // 替换为你的IG静态ID
const pkField = ig.model.getFieldKey("ID"); // 替换为你的主键列名
const selectedIds = apex.item("P1_SELECTED_IDS").getValue().split(",");

if (selectedIds.length > 0 && selectedIds[0] !== "") {
    ig.model.forEach(record => {
        const recordId = record[pkField].toString();
        if (selectedIds.includes(recordId)) {
            ig.setSelectedRecords([record], true); // true表示追加选中,不清除现有选中
        }
    });
}

方案二:监听IG过滤事件,实时保存/恢复选中状态

直接在IG初始化代码中监听过滤的开始与结束事件,无需额外页面项:

function(options) {
    options.defaultGridViewOptions = {
        persistSelection: true
    };

    const ig = apex.region(options.regionId).widget().interactiveGrid();
    const gridView = ig.getViews("grid");
    const pkField = gridView.model.getFieldKey("ID"); // 替换为你的主键列名
    let savedSelectedIds = [];

    // 过滤开始前保存当前选中的主键
    ig.on("filterstart", function() {
        savedSelectedIds = gridView.getSelectedRecords().map(record => record[pkField].toString());
    });

    // 过滤结束后恢复选中状态
    ig.on("filterend", function() {
        if (savedSelectedIds.length === 0) return;
        
        gridView.model.forEach(record => {
            const recordId = record[pkField].toString();
            if (savedSelectedIds.includes(recordId)) {
                gridView.setSelectedRecords([record], true);
            }
        });
    });

    return options;
}

注意事项

  • 确保主键列在IG的模型中存在(即使列被隐藏也不影响,只要查询语句包含该列)
  • 若数据量极大,保存大量选中ID可能存在性能损耗,可根据业务需求调整为仅保留关键选中记录
  • 测试时覆盖搜索、分页、多条件过滤等场景,验证选中状态的正确性

内容的提问来源于stack exchange,提问作者vr_oracle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:57:41