- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个要显示的嵌套问题列表。最初,我显示 1 级问题,然后根据用户对其父问题的回答显示子问题。所有问题都有一个单选按钮,一些问题有一个输入框,用于在用户选择"is"时显示附加信息
这是我的带有嵌套数据表的 JSF 代码。请注意,为了简化论坛上的问题,我已经删除了这些问题的格式,因此如果您将此代码复制到您自己的环境中并运行代码,这些问题可能看起来“不漂亮”:
<h:dataTable id="questionTable" var="q" value="#{generalQuestionBean2.questions.questions}">
<h:column><h:panelGroup id="questionGrp">
#{q.question} <h:selectOneRadio value="#{q.answer}">
<f:selectItem itemValue="1" itemLabel="Yes"/>
<f:selectItem itemValue="0" itemLabel="No"/>
<f:ajax event="valueChange" execute="@form"
render="questionGrp"
listener="#{generalQuestionBean2.reset}"/>
</h:selectOneRadio> <h:inputText value="#{q.addnInfo}"
rendered="#{q.answer eq '1' and q.field ne 'otherCov'}"></h:inputText>
<h:panelGroup id="questionGrpSubs" rendered="#{q.addnQuestions ne null and q.answer eq '1'}">
<h:dataTable id="subQuestionTable" var="subq" value="#{q.addnQuestions}">
<h:column><h:panelGroup id="subQuestionGrp">
->#{subq.question} <h:selectOneRadio id="answer" value="#{subq.answer}">
<f:selectItem itemValue="1" itemLabel="Yes"/>
<f:selectItem itemValue="0" itemLabel="No"/>
<f:ajax event="valueChange" execute="@form"
render="subQuestionGrp"
listener="#{generalQuestionBean2.reset}"/>
</h:selectOneRadio><h:inputText value="#{subq.addnInfo}"
rendered="#{subq.answer eq '1' and subq.field ne 'voluntaryComp' and subq.field ne 'uslh'}"></h:inputText>
<h:panelGroup id="questionGrpSubs2" rendered="#{subq.addnQuestions ne null and subq.answer eq '1'}">
<h:dataTable id="sub2QuestionTable" var="sub2q" value="#{subq.addnQuestions}">
<h:column><h:panelGroup id="sub2QuestionGrp">
-->#{sub2q.question} <h:selectOneRadio id="answer" value="#{sub2q.answer}">
<f:selectItem itemValue="1" itemLabel="Yes"/>
<f:selectItem itemValue="0" itemLabel="No"/>
<f:ajax event="valueChange" execute="@form"
render="sub2QuestionGrp"
listener="#{generalQuestionBean2.reset}"/>
</h:selectOneRadio><h:inputText value="#{sub2q.addnInfo}"
rendered="#{sub2q.answer eq '1'}"></h:inputText>
</h:panelGroup></h:column>
</h:dataTable></h:panelGroup>
</h:panelGroup></h:column>
</h:dataTable></h:panelGroup>
</h:panelGroup></h:column>
</h:dataTable>
下面是支持 bean 上的重置函数的代码:
private void reset(AjaxBehaviorEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
String id = event.getComponent().getClientId(context);
String[] tokens = id.split("[:]+");
int qId = -1;
int subqId = -1;
int sub2qId = -1;
for (int i = 0; i < tokens.length; i++) {
if(tokens[i].equals("questionTable"))
qId = Integer.parseInt(tokens[i+1]);
if(tokens[i].equals("subQuestionTable"))
subqId = Integer.parseInt(tokens[i+1]);
if(tokens[i].equals("sub2QuestionTable"))
sub2qId = Integer.parseInt(tokens[i+1]);
}
Question q = questions.getQuestion(qId);
Question processQ = q;
String defaultSubAnswer = getDefaultSubAnswer(q.getField());
Question subq;
Question subq2;
if(subqId > -1) {
subq = q.getAddnQuestions().get(subqId);
processQ = subq;
if(sub2qId > -1) {
subq2 = subq.getAddnQuestions().get(sub2qId);
processQ = subq2;
}
}
resetValue(processQ, defaultSubAnswer);
}
private void resetValue(Question q, String defaultSubAnswer) {
q.setAddnInfo("");
if(q.getAddnQuestions() != null) {
for (int i = 0; i < q.getAddnQuestions().size(); i++) {
Question subq = q.getAddnQuestions().get(i);
subq.setAnswer(defaultSubAnswer);
resetValue(subq, defaultSubAnswer);
}
}
}
问题是:
ajax 事件应该默认为“valueChange”。如果我点击"is"然后再次点击"is",ajax 调用应该不会发生,对吗?但它是,因为附加信息框正在根据重置功能清除。
我最初尝试向重置函数添加一个条件以检查被单击的按钮的值,并且仅在答案为“0”(否)时重置 addnInfo 值和子问题。但这会导致呈现出现问题,因为 ajax 调用会呈现输入框和子问题以隐藏并且值将保留在前端,即使它们在支持 bean 上被重置。当它们重新呈现到前端时,显示的是保留的值,而不是 backing bean 中的值。
另一个尝试是使用 ValueChangeListener 来重置值。但这仍然存在与重新渲染时保留的值相同的问题。
我尝试了 3 种不同的方法(上面列出的),但都失败了。我愿意听取任何这些解决方案或可能是其他解决方案的解决方案。请记住,用户的格式限制使我可以使用的选项更少。
最佳答案
Ajax Listener event valueChange seems to be firing onClick instead of onChange
这确实是默认值 valueChange
由各个 JSF 组件生成的单选按钮和复选框使用的事件。检查生成的 HTML 源代码,您会发现它已挂接到 onclick
。 .默认情况下 JSF 这样做的原因对于复选框是明确的,但乍一看对于单选按钮并不完全清楚,因为它们无论如何都不能取消选中。真正的原因是为了保证IE6/7的兼容性才做的onchange
在该浏览器中第一次点击时不会触发。
如果您不关心 IE6/7 用户(但最近其分布急剧下降),则将其更改为 event="change"
反而。
<f:ajax event="change" ... />
这样 JSF 将在 onchange
上生成事件处理程序反而。
更新:你可以使用jQuery的 .on('change')
函数绑定(bind)器,它将修复 change
上的 IE6/7 错误行为事件。在 <h:head>
中包含以下内容如果您还没有使用 jQuery:
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
并在加载时执行此函数:
$(function() {
$(':radio').each(function() {
var handler = this.onclick;
this.onclick = null;
$(this).on('change', handler);
});
});
这基本上会为每个单选按钮移动 JSF 生成的 onclick
属性为 change
由 jQuery 管理的事件处理程序,因此它可以在所有浏览器中一致地工作,包括 IE6/7。
我们当然也可以使用纯 JS 来完成,但这需要大量样板和跨浏览器敏感代码。
关于Ajax Listener 事件 valueChange 似乎触发了 onClick 而不是 onChange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8303961/
我是 AngularFire + Firebase 的新手,我正在尝试从 angularfire2 github 上学习教程。 当我执行这段代码时: items: Observable; cons
我正在开发 AngularJS PWA 应用程序(在我的注册组件中有表格) 表单有 3 个步骤: 第一步 名字 姓氏 电子邮件 密码 电话号码 第 2 步 例子 例子 第 3 步 例子 例子 当我的用
使用 angularfire2 开发 Angular5 应用程序。我有一个包含大量项目的列表。当我订阅它时: this.db.list("/list").valueChanges().subscrib
在我的一个页面上,我使用 FormBuilder 在初始化时填写表单。只要输入不为空,每个输入都会得到一个类。这是通过向每个输入添加一个 ngClass 并订阅 FormGroup 的 valueCh
我正在创建一个动态创建的响应式表单。我以可观察对象(来自主题)的形式从服务获取数据,并希望在表单创建后订阅表单的 valueChanges。当我第一次设置它时,我订阅了服务的每个可观察对象和 valu
this.editForm = this.fb.group({ step1: this.fb.group({ transport_type_id: ['', [
我有点不清楚 valueChanges 实际上做了什么——如果我的订阅看起来像这样: ( typescript /角度) this.accountsCollection = this.fire
Winforms 2.0。将 DateTimePicker 粘贴到表单上。默认为今天。单击下拉箭头以显示日历,然后单击“今天”。 ValueChanged 事件确实会触发,即使它已经设置为今天。 我想
我们有一个 Angular 子表单,通过 Valuechanges 发出值。在父组件中,如果子组件的新邮政编码值与以前的邮政编码值不同,我们希望运行任务。 现在,我们正在创建一个变量来存储以前的邮政编
我是 Java 新手,遇到了一些问题,如果这是一个显而易见或经常回答的问题,我很抱歉,但我已经查看了大约 10 个此类类型的其他错误,但无法找出我的问题。我在主程序中的标记行上收到错误,表示构造函数未
如果组合框中的值发生更改,如何在组合查看器中触发事件?并非每个选择都会触发(addSelectionChangedListener)。我只想触发一个事件,仅当当前选择不同的值时才触发,而不是相同的值。
使用键盘上的数字输入值时不会激活事件。它仅在您使用向上和向下箭头时激活。我想要的是,它必须像文本框 textchanged 事件一样在每次键盘敲击时激活。 我尝试了几件事,但用户必须按 Enter 才
在这个简单的 gui 列表上进行选择时,我得到 valueChanged 在鼠标按下时执行两次,鼠标抬起时执行一次。 import groovy.swing.SwingBuilder import j
我正在尝试使用 Adafruit Bluefruit LE(蓝牙 4 模块)与 arduino 通信,一切都已设置并配对等等,但我在 GattCharacteristic 上遇到了 ValueChan
我想用UISlider实时计算一个数字,这是我的方法: @IBAction func HPsliderValueChanged(_ sender: CustomUISlider) { calc
我这里有一个包含两 (2) 列的 JTable。右栏是可编辑的,而另一栏是不可编辑的。 所以,我的问题是,每当用户更改单元格的值时,该特定单元格将更改其单元格颜色。 我想这样做是因为我想让用户知道他/
我的最终目标是制作一个也允许用户输入的下拉菜单。我似乎能做的最好的事情就是在下拉列表旁边添加一个文本框,使其看起来相似,我遇到的问题是,每当我的下拉值发生更改时,我都需要更新文本框。我有一些我一直在玩
假设我有一个 QSpinBox,其中的值为 123.45。如果我手动编辑它并开始删除这五个值,则 valueChanged 会针对值 123.4 被触发。如果我继续删除这四个,就会再次发生。 如果我在
我想创建一个表单,允许用户在五个不同的字段 (NumericUpDown) 中设置一定数量的点。当该点数达到 0 时,用户将无法再添加。 (不过,我仍然希望用户能够删除积分。) 到目前为止,这是我的代
我正在使用 UIDatePicker 用日期更新 UILabel,但我注意到 valueChanged 事件仅在车轮停止转动。 理想情况下,如果用户轻弹一列,我希望标签中的日期随着滚轮旋转而不断更新,
我是一名优秀的程序员,十分优秀!