在ui:repeat中使用多个h:form

3

我正在尝试在一个页面上使用多个 h:form,它们由一个 ui:repeat 组件渲染。如果只有一个生成的 h:form,则一切都可以完美工作。如果有多个 h:form,则只有最新的 h:form 能够正常工作!(如果我尝试提交除最后一个之外的另一个表单,则仅传递 null 给我的服务!)

<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个回答

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="新建表单" action="#{myService.newForm(element)}"/> </h:panelGroup> </ui:repeat> </h:form> 请注意h:formprependIdui:repeatidvarStatusa:commandButtonexecute

顺便提一下,如果a:代表ajax4jsf,我不建议在commandLink中嵌套使用commandButton。


在这种情况下,控制器如何知道从集合中选择哪个表单实例?也就是说,如果ui:repeat有7次迭代,并且每次迭代的字段名称相同(也就是没有索引),那么这是否会引入歧义? - amphibient
1
@amphibient 你所说的“named”是什么意思?如果你指的是id,那么是的,它们应该在整个dom内唯一,并且确实如此。当上面的代码呈现时,打开html源代码后,您会看到带有id的span(h:panelGroup) newKingRepeat:0:newKindPanelnewKingRepeat:1:newKindPanelnewKingRepeat:2:newKindPanel等等。 ui:repeat将其自己的id和当前索引前缀添加到其中的组件id中。 execute =“newKingRepeat:#{varStatus.index}:newKindPanel” 部分决定将提交哪个span内容到服务器端。 - tt_emrah

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,这是我唯一能提出的建议。


它可以与列表一起正常工作,使用Datamodel并非强制要求。 - tt_emrah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接