我正在使用JDev 12c。
我正在尝试使用一些复选框作为单选按钮:
但我无法使其发挥作用。
我有一个表单 - 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>
我看到完全相同的奇怪行为.....我似乎无法选中复选框。复选标记就消失了。
有什么输入?我被困在这里。
/ 金
答案 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>