错误后维护复选框状态

时间:2011-09-20 15:27:05

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

我正在使用Oracle ApEx并使用以下apex_item.checkbox调用标准SQL报告,即:

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方法也可以工作。

1 个答案:

答案 0 :(得分:3)

我找到了一些方法来实现这一点,混合了apex和jquery:

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

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

我根据emp和您的查询(但遗漏了where子句)做了一份报告(报告1)。 Page overview

我的提交过程中,我收到了复选框(通过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;

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

Dynamic action details

  • 事件:刷新后
  • 选择类型:地区
  • 地区:(您的报告区域,我的报告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框检查!

这里希望我没有过头:)