多个h:ui中的表单:重复

时间:2011-04-17 23:28:46

标签: jsf richfaces

我正在尝试在页面上使用ui:repeat组件呈现多个h:表单。如果我只有一个生成的h:表单,一切都很完美。如果我有多个h:表单,只有最新的h:表单才有效! (如果我尝试提交另一个表单,那么最后一个表单只通过我的服务传递空!)

<ui:repeat var="element" value="#{myService.elementList}">



            <rich:simpleTogglePanel switchType="client"
                                    label="#{element.codeElement} - #{element.description}" 
                                    opened="#{myService.isUiSelected(element)}"
                                    onexpand="expand#{element.codeElement}()"
                                    oncollapse="collapse#{element.codeElement}()">



    <h:form id="newKindForm">
      <a:commandLink ajaxSingle="true" id="idLink" onclick="#{rich:component('newTargetPanel')}.show()">
       <a:commandButton id="myButton" 
                        value="new Form"
                    action="#{myService.newForm(element)}"/> 
       </a:commandLink>                
    </h:form>


    <rich:modalPanel id="newTargetPanel" autosized="true" width="450">
       <f:facet name="header">
         <h:outputText value="My Pannel Title" />
       </f:facet>
       <f:facet name="controls">
          <h:panelGroup>
             <h:graphicImage value="/img/close.png" 
                             id="hidelink"
                             styleClass="hidelink" />
                <rich:componentControl for="newTargetPanel" 
                                       attachTo="hidelink"
                                       operation="hide" 
                                       event="onclick" />
          </h:panelGroup>
       </f:facet>



<!-- THIS IS THE PROBLEMATIC FORM -->
<h:form>
     <a:include viewId="../myRepeatableForm.xhtml" />
</h:form>



</rich:modalPanel>



</ui:repeat>

有什么建议吗?

谢谢

2 个答案:

答案 0 :(得分:1)

您可以在一个表单中包含所有内容,并使用execute属性仅提交所需的元素。像这样:

<h:form id="newKindForm" prependId="false"> <ui:repeat id="newKindRepeat" var="element" value="#{myService.elementList}" varStatus="varStatus"> <h:panelGroup id="newKindPanel"> <a:commandButton id="myButton" execute="newKindRepeat:#{varStatus.index}:newKindPanel" onclick="#{rich:component('newTargetPanel')}.show()" value="new Form" action="#{myService.newForm(element)}"/> </h:panelGroup> </ui:repeat> </h:form>

请注意prependId的{​​{1}},h:formid varStatus ui:repeat execute的{​​{1}}。

顺便说一下,假设a:commandButton代表ajax4jsf,我建议不要使用嵌套在commandLink中的commandButton。

答案 1 :(得分:0)

#{myService.elementList}是一个列表吗?如果是这样,我不确定这是否有效。请尝试使用javax.faces.model.DataModel。请务必仔细阅读文档。它的工作原理如下:

public Datamodel getElements(){
  if(elements == null)
      elements = new ListDataModel(getElementList()); 
    return elements;
}

public List<Element> getElementList(){
    elementList = foo(); // load the elements in your List like you did before
    return elementList;
}
在您的观点中

<ui:repeat var="element" value="#{myService.elements}">

我不熟悉RichFaces,这是我能提出的唯一建议。