【问题标题】:Maintaining checkbox state after an error错误后保持复选框状态
【发布时间】:2021-04-11 01:02:27
【问题描述】:

我正在使用 Oracle ApEx 并有一个标准 SQL 报告,其中包含以下 apex_item.checkbox 调用,即:

select 
apex_item.checkbox(1, empno) cbox, 
"EMPNO",
"ENAME",
"JOB",
"MGR",
"HIREDATE",
"SAL",
"COMM",
"DEPTNO"
from "EMP" 
where 
( 
instr(upper("ENAME"),upper(nvl(:P1_REPORT_SEARCH,"ENAME"))) > 0 or
instr(upper("JOB"),upper(nvl(:P1_REPORT_SEARCH,"JOB"))) > 0 
)

我的问题是,除了在我的一个页面中包含此报告外,页面上还有其他必填项,因此当用户根据上述 SQL 单击 10 个复选框中的 3 个并提交页面时,会向用户显示一个错误,表明页面上的某个项目是必需的。

现在,当用户看到此错误时,已选中的 10 个复选框中的 3 个现在未选中。

我可以根据上述情况维护复选框持久性/状态吗?因为我不希望用户重新检查他们已经检查过的记录。

如果可能,我有兴趣使用 Oracle ApEx 方法解决这个问题。但是,jQuery 方法也可以工作。

【问题讨论】:

    标签: jquery checkbox persistence session-state oracle-apex


    【解决方案1】:

    我找到了一些方法来做到这一点,结合了 apex 和 jquery:

    • 在提交过程中:获取复选框的状态(通过apex_application)并通过apex_collections存储它们

    • 在 resfresh 之后:通过 ajax 回调获取值并使用一些 javascript 代码再次设置它们。

    我根据emp 制作了一份报告(报告 1),其中包含您的查询(但省略了 where 子句)。

    我在提交过程中获得选中的复选框(通过 apex_application,您只会得到选中的复选框!),并将它们保存在一个集合中。每次提交时都会创建或清空此集合。我离开了调试 消息,因此您可以跟踪它们。 哦,存储的值是 empno,因为您基于该列的复选框项目,而不是 1 或 0。

    apex_debug_message.log_message('on submit point');
    APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION('COLL_REPORT1');
    
    FOR i IN 1..APEX_APPLICATION.G_F01.COUNT LOOP
    apex_debug_message.log_message('loop chk: '||i||': '||TO_NUMBER(APEX_APPLICATION.G_F01(i)));
       APEX_COLLECTION.ADD_MEMBER(p_collection_name => 'COLL_REPORT1', 
                                  p_n001 => TO_NUMBER(APEX_APPLICATION.G_F01(i))
                                  );
    END LOOP;
    

    然后创建一个ajax回调过程: 我在这里创建了一个 json 数组,它只保存复选框的值,并帮助我在之后轻松解析这些值。集合在检索后被截断。

    DECLARE
       v_first BOOLEAN := TRUE;
       v_json VARCHAR2(4000);
    BEGIN
       v_json := '[';
       FOR r IN (SELECT n001 FROM APEX_collections
                  WHERE collection_name = 'COLL_REPORT1')
       LOOP
          apex_debug_message.log_message('stored value: '||r.n001);
          IF NOT v_first THEN
             v_json := v_json ||',';
          ELSE
             v_first := FALSE;
          END IF;
          v_json := v_json || r.n001;
       END LOOP;
    
       v_json := v_json || ']';
    
       APEX_COLLECTION.TRUNCATE_COLLECTION('COLL_REPORT1');
    
       htp.p(v_json);
    END;
    

    然后需要检索和设置值,这是通过动态操作完成的。

    • 事件:刷新后
    • 选择类型:地区
    • 区域:(你的报告区域,我的是报告1)
    • 无条件

    代码:

       var oDBGet = new htmldb_Get(null, &APP_ID., 'APPLICATION_PROCESS=get_checked_boxes', &APP_PAGE_ID.);
       var arrBoxes = jQuery.parseJSON(oDBGet.get());
    
       $.each(arrBoxes,
              function( intIndex, objValue ){
                 $("input[name='f01'][value='"+objValue+"']").attr("checked","checked");
              });
    

    此代码只是调用 ajax 回调并将返回的字符串解析为 json 对象(由于 [value,value,value] 语法,它是一个数组)。 然后我循环遍历这个数组并在名称为f01 的输入元素上设置值(动态创建的复选框,这是基于给定 apex_item.checkbox 的 id),其中的值等于我们存储的值.通过attr 复选框被选中!

    希望我没有做得过火 :)

    【讨论】:

    • 嗨,汤姆,首先我想说的是,非常感谢您的回复以及非常详细和有用的回复,也解决了我的问题。所以谢谢。如果我能给你更高的分数,我会的。希望您能再次帮助我解决可能的其他 Apex 问题。再次感谢。
    • 谢谢!我自己现在才在 Apex 工作了 2 个月,而且事情真的开始越来越多。我也经历了一些看似愚蠢的简单问题的激烈搜索,并且会很乐意提供帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2012-08-25
    • 2016-06-19
    • 2013-03-25
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多