我正在尝试在页面上使用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>
有什么建议吗?
谢谢
答案 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:form
和id
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,这是我能提出的唯一建议。