【问题标题】:multiple h:forms in ui:repeatui:repeat 中的多个 h:forms
【发布时间】:2011-08-07 12:27:36
【问题描述】:

我试图在一个页面上有多个 h:forms,这些表单使用 ui:repeat 组件呈现。如果我只有一个生成的 h:form,那么一切都很完美。如果我有多个 h:forms,只有最新的 h:forms 可以工作! (如果我尝试提交另一个表单,那么最后一个,只有 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>

有什么建议吗?

谢谢

【问题讨论】:

    标签: jsf richfaces


    【解决方案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>

    请注意prependIdh:formidvarStatusui:repeatexecutea:commandButton

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

    【讨论】:

    • 在这种情况下,控制器如何知道要从集合中选择哪个表单实例? IOW,如果ui:repeat 有 7 次迭代,并且每次迭代的字段都被命名为相同(IOW 没有索引),那不会引入歧义吗?
    • @amphibient 你所说的“命名”是什么意思?如果您的意思是 id,是的,它们应该在 dom 范围内是唯一的,而且它们是。当您在呈现上述代码后打开 html 源代码时,您会看到带有 id 的 spans (h:panelGroup) newKingRepeat:0:newKindPanelnewKingRepeat:1:newKindPanelnewKingRepeat:2:newKindPanel 等等...ui:repeat 预先添加了它自己的 id以及嵌套在其中的组件 ID 的当前索引。 execute="newKingRepeat:#{varStatus.index}:newKindPanel" 部分决定将哪个 span 内容提交到服务器端。
    【解决方案2】:

    #{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;
    }
    

    在你看来:&lt;ui:repeat var="element" value="#{myService.elements}"&gt;

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

    【讨论】:

    • 它应该适用于列表。使用 Datamodel 不是强制性的。
    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多