ui:repeat 中的 Valuechange Listener 仅适用于最后一个重复的组件
Valuechange Listener inside ui:repeat only works for the last repeated component
我正在使用 JSF 和 Glassfish。我在 ui:repeat 几个 h:inputtextarea 中有一个 valuechange 侦听器。问题是 valuechangelistener 只为最后一个组件触发。这是我的代码。
answerhandler return 定义内容的 Answerentities (JPA) 列表。 answerhandler 本身是一个 ManagedBean,它是我的控制器。
我知道代码有点多余,但这不是问题所在。
如果提交表单,则应触发 valuechangelistener --> 单击按钮 "save"。但它只针对最后一个重复的形式被触发。
第一个 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 class 和调用的方法
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();
}
}
提前感谢您的帮助:)
编辑
我将 ui:repeat 包裹在 h:form 中,现在可以使用了。感谢 https://whosebug.com/users/3773914/tt-dev 的评论,它真的帮助了我。你能解释一下为什么它在 h:form 包裹 ui:repeat 时起作用吗?
我真的不记得这背后的确切原因,但是,当你在转发器组件中呈现多个表单时,只有最后呈现的表单提交请求。
所以解决方案是将 h:form
放在 ui:repeat
之外。
ps: 在页面上使用多个表单,这些表单不是在转发器内生成的,可以正常工作。
编辑:似乎是一个错误,BalusC 在这里提到了这个错误:<h:form> within <ui:repeat> not entirely working, only the last <h:form> is processed
我正在使用 JSF 和 Glassfish。我在 ui:repeat 几个 h:inputtextarea 中有一个 valuechange 侦听器。问题是 valuechangelistener 只为最后一个组件触发。这是我的代码。
answerhandler return 定义内容的 Answerentities (JPA) 列表。 answerhandler 本身是一个 ManagedBean,它是我的控制器。 我知道代码有点多余,但这不是问题所在。 如果提交表单,则应触发 valuechangelistener --> 单击按钮 "save"。但它只针对最后一个重复的形式被触发。
第一个 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 class 和调用的方法
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();
}
}
提前感谢您的帮助:)
编辑
我将 ui:repeat 包裹在 h:form 中,现在可以使用了。感谢 https://whosebug.com/users/3773914/tt-dev 的评论,它真的帮助了我。你能解释一下为什么它在 h:form 包裹 ui:repeat 时起作用吗?
我真的不记得这背后的确切原因,但是,当你在转发器组件中呈现多个表单时,只有最后呈现的表单提交请求。
所以解决方案是将 h:form
放在 ui:repeat
之外。
ps: 在页面上使用多个表单,这些表单不是在转发器内生成的,可以正常工作。
编辑:似乎是一个错误,BalusC 在这里提到了这个错误:<h:form> within <ui:repeat> not entirely working, only the last <h:form> is processed