0

我正在使用 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>

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

有输入吗?我被困在这里。

/ 金

4

1 回答 1

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>
于 2013-09-29T22:39:45.413 回答