Oracle ADF复选框丢失状态

时间:2013-09-27 14:31:32

标签: javascript oracle oracle-adf

我正在使用JDev 12c。

我正在尝试使用一些复选框作为单选按钮:

http://jsfiddle.net/TTZqa/

但我无法使其发挥作用。

我有一个表单 - t2 - 包含三行,其中每行有一个复选框。当用户选中复选框时,应该选中它,如果已经选中了另一个复选框,则应该取消选中该复选框。

应该只能检查一行,并且在提交时必须检查一行。

我的复选框上有以下监听器:

<af:clientListener type="click" method="sayHello"/>

我的JS函数看起来像这样:

function sayHello(event) {
          event.cancel();
          var source = event.getSource();

          var chk1 = AdfPage.PAGE.findComponentByAbsoluteId('t2:0:sbc1');
          var chk2 = AdfPage.PAGE.findComponentByAbsoluteId('t2:1:sbc1');
          var chk3 = AdfPage.PAGE.findComponentByAbsoluteId('t2:2:sbc1');

          if (source == chk1) {
              chk1.setValue(true);
              chk2.setValue(false);
              chk3.setValue(false);
          }
          else if (source == chk2) {
              chk1.setValue(false);
              chk2.setValue(true);
              chk3.setValue(false);
          }
          else if (source == chk3) {
              chk3.setValue(true);
              chk2.setValue(false);
              chk1.setValue(false);
          }
      }

我知道在单击任一复选框但仍未选中所有框时调用该函数。我可以看到复选标记短暂闪烁但不会停留。

如果我调用一个空的javascript函数,用户可以单击所有三个复选框,复选标记保留在框中,但它们不是互斥的,它可以按照我的预期工作。

但是当我写这样的函数时:

function sayHello(event) {
          event.cancel();
          var source = event.getSource();
          var chk1 = AdfPage.PAGE.findComponentByAbsoluteId('t2:0:sbc1');

}

复选标记立即消失。

我试图删除'event.cancel();但它没有任何区别。

我甚至可以用相同形式的输入字段替换我找到的组件,并将文本替换为它。文本出现在输入字段中,但复选标记会立即从复选框中消失。

我研究过:

http://technology.amis.nl/2013/05/07/adf-client-side-architecture-select-all/

我在这里做错了什么?

感谢

编辑:

我创建了以下非常简单的页面:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html>
<f:view xmlns:f="http://java.sun.com/jsf/core" xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
<af:document title="untitled2.jsf" id="d1">
    <af:messages id="m1"/>
    <af:resource type="javascript">      
      function sayHello(event) {
          event.cancel();
          var source = event.getSource();
          var chk1 = AdfPage.PAGE.findComponentByAbsoluteId('sbc1');
          var chk2 = AdfPage.PAGE.findComponentByAbsoluteId('sbc2');
          var chk3 = AdfPage.PAGE.findComponentByAbsoluteId('sbc3');
          if (source == chk1) {
              chk1.setValue(true);
              chk2.setValue(false);
              chk3.setValue(false);
          }
          else if (source == chk2) {
              chk2.setValue(true);
              chk1.setValue(false);
              chk3.setValue(false);
          }
          else if (source == chk3) {
              chk3.setValue(true);
              chk2.setValue(false);
              chk1.setValue(false);
          }        
      }
    </af:resource>
    <af:form id="f1">
        <af:panelGridLayout id="pgl1">
            <af:gridRow height="100%" id="gr1">
                <af:gridCell width="100%" halign="stretch" valign="stretch" id="gc1">
                    <!-- Content -->
                    <af:selectBooleanCheckbox label="Label1" id="sbc1" clientComponent="true">
                        <af:clientListener type="click" method="sayHello"/>
                    </af:selectBooleanCheckbox>
                    <af:selectBooleanCheckbox label="Label1" id="sbc2" clientComponent="true">
                        <af:clientListener type="click" method="sayHello"/>
                    </af:selectBooleanCheckbox>
                    <af:selectBooleanCheckbox label="Label1" id="sbc3" clientComponent="true">
                        <af:clientListener type="click" method="sayHello"/>
                    </af:selectBooleanCheckbox>
                </af:gridCell>
            </af:gridRow>
        </af:panelGridLayout>
    </af:form>
</af:document>

我看到完全相同的奇怪行为.....我似乎无法选中复选框。复选标记就消失了。

有什么输入?我被困在这里。

/ 金

1 个答案:

答案 0 :(得分:0)

尝试用以下内容替换javascript函数:

<af:resource type="javascript">      
  function sayHello(event) {
      var source = event.getSource();
      var chk1 = source.findComponent('sbc1');
      var chk2 = source.findComponent('sbc2');
      var chk3 = source.findComponent('sbc3');
      if (source.getId() == chk1.getId()) {
          chk1.setValue(true);
          chk2.setValue(false);
          chk3.setValue(false);
      }
      else if (source.getId() == chk2.getId()) {
          chk2.setValue(true);
          chk1.setValue(false);
          chk3.setValue(false);
      }
      else if (source.getId() == chk3.getId()) {
          chk3.setValue(true);
          chk2.setValue(false);
          chk1.setValue(false);
      }        
      event.cancel();
  }
</af:resource>