我使用的是JSF和Glassfish。我在一个ui:repeat几个h:inputtext区域中有一个valuechangeListener。问题是valuechangelistener只为最后一个组件触发。这是我的密码。
应答处理程序返回一个定义内容的应答实体(JPA)列表。应答处理程序本身是一个ManagedBean,它是我的控制器。我知道代码有点多余,但这不是问题所在。如果提交表单-->并单击"保存"按钮,则应触发valuechangelistener。但它只针对最后一个重复的形式进行发射。
第一个xhtml文件:
<ui:repeat var="a" value="#{answerHandler.answerByCreated}">
<h:form>
<h:inputTextarea readonly="#{!a.equals(answerHandler.tobeEdited)}"
id="showacontent" value="#{a.content}" class="form-control questiontextarea"
rows="8" valueChangeListener="#{answerHandler.acontentChanged}"
pt:maxlength="2500"/>
<div class="btn-group btn-group-sm" >
<h:commandButton action="#{answerHandler.setEditable(a)}" rendered="#{answerHandler.canEditAnswer(a) and !answerHandler.isEdit}" class="btn btn-primary" value="Edit" />
<h:commandButton action="#{answerHandler.cancel()}" rendered="#{answerHandler.isEdit and a.equals(answerHandler.tobeEdited)}" class="btn btn-primary" value="Cancel" />
<h:commandButton action="#{answerHandler.saveChanges(a)}" rendered="#{answerHandler.isEdit and a.equals(answerHandler.tobeEdited)}" class="btn btn-primary" value="Save" />
</div>
</h:form>
</ui:repeat>
这里的answerhandler类具有调用的方法
public void acontentChanged(ValueChangeEvent e) {
if (e != null) {
System.out.println("change");
oldcontent = e.getOldValue().toString();
tobeEdited.setContent(e.getNewValue().toString());
saveChanges(tobeEdited);
}
}
public void saveChanges(Answer a) {
if (canEditAnswer(a)) {
a.setEdited(new Date());
aManager.edit(a);
disableEditable();
}
}
感谢您提前提供的帮助:)
编辑
我用h:形式包装了ui:repeat,现在它工作了。谢谢https://stackoverflow.com/users/3773914/tt-dev你的评论真的帮了我一把。你能解释一下为什么h:form包装ui:repeat时它有效吗?
我实际上记不清这背后的确切原因,但当您在转发器组件中呈现多个表单时,只有最后一个呈现的表单提交请求。
因此解决方案是将CCD_ 1放置在CCD_。
ps:在页面上使用多个表单,这些表单不是在中继器内生成的,效果很好。
edit:似乎是一个bug,BalusC:<h: 表单>在<ui:repeat>不完全起作用,只有最后<h: 表单>已处理