【问题标题】:Oracle ADF Check box losing stateOracle ADF 复选框丢失状态
【发布时间】:2013-09-27 14:31:32
【问题描述】:

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

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

任何输入?我被困在这里了。

/ 金

【问题讨论】:

  • 您是否尝试提醒您收到的值。例如,您是否尝试发出警报(source.getValue());看看你收到了什么。您是否还确保 chk1、chk2 和 chk3 实际创建成功。我相信您的比较应该基于 Id,而不是相等 source.getId() == chk1.getId()

标签: javascript oracle oracle-adf


【解决方案1】:

尝试将 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2022-10-05
    • 2011-09-13
    • 2011-03-31
    相关资源
    最近更新 更多