Ui中的Valuechange Listener:repeat仅适用于最后重复的组件

时间:2015-04-16 15:03:57

标签: jsf uirepeat valuechangelistener

我正在使用JSF和Glassfish。我有一个ui:重复几个h:inputtextarea我有一个valuechange Listener。问题是valuechangelistener仅针对最后一个组件触发。这是我的代码。

answerhandler返回定义内容的Answerentities(JPA)列表。 answerhandler本身是一个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();
   }
}

提前感谢您的帮助:)

修改

我包裹了ui:以h:形式重复,它现在有效。感谢您https://stackoverflow.com/users/3773914/tt-dev的评论,这真的帮助了我。你可以解释为什么它在h:form包装ui:repeat?

时有效

1 个答案:

答案 0 :(得分:2)

我实际上不记得这背后的确切原因但是,当你在转发器组件中渲染多个表单时,只有最后一个表单提交请求。

所以解决方法是将h:form放在ui:repeat之外。

ps:在页面上使用多个表单,这些表单在转发器中不会生成。

编辑:似乎是一个错误,BalusC在此提及:<h:form> within <ui:repeat> not entirely working, only the last <h:form> is processed