是否可以在运行时使用JSF创建多个selectOneMenu?
我的问题是我想在每次用户选择上一个selectOneMenu中的项目时创建另一个selectOneMenu。
页面加载时加载第一个列表, 在这里我尝试过:
<h:form id="form">
<p:panel id="panel">
<p:selectOneMenu id="selCaterogy" value="#{connaissance.category}" filter="true" filterMatchMode="startsWith">
<f:selectItem itemLabel="Select une catégorie..." itemValue="" />
<f:selectItems value="#{connaissanceDAO.category}"/>
<p:ajax listener="#{connaissance.addComponent()}"/>
</p:selectOneMenu>
</p:panel>
</h:form>
public void addComponent(){
UIComponent parent = FacesContext.getCurrentInstance().getViewRoot().findComponent("form:panel");
includeCompositeComponent(parent, "http://primefaces.org/ui", "selectOneMenu", "randomID");
System.out.println("Added");
}
includeCompositeComponent
来自this question
public static void includeCompositeComponent(UIComponent parent, String taglibURI, String tagName, String id) {
FacesContext context = FacesContext.getCurrentInstance();
UIComponent composite = context.getApplication().getViewHandler()
.getViewDeclarationLanguage(context, context.getViewRoot().getViewId())
.createComponent(context, taglibURI, tagName, null);
composite.setId(id);
parent.getChildren().add(composite);
}
但该组件未被添加。 另外,如果可以在运行时添加组件,我可以在将其添加到页面之前填充选择菜单吗?
使用Java EE7,tomcat 8和primefaces 5.0。
答案 0 :(得分:1)
如果您的目标只是创建多个SelectOneMenue,那么只需使用<ui:repeat>
并在其中包含您的组件。
通过这种方式,您只需将列表中的项目绑定到<ui:repeat>
,然后将所需的值设置为这些项目,它就会呈现给页面。
<ui:repeat value="#{bean.list}" var="item">
<h:selectOneMenu value="#{item.value}" >
<h:selectItem itemLabel="..." itemValue="..."></h:selectItem>
</h:selectOneMenu>
</ui:repeat>
在你的bean中:
public void change(ValueChangeEvent e){
theList.add(new SomeObject("value"))
}
答案 1 :(得分:0)
通过使用数据表,您可以在页面上添加任意数量的行(selectOneMenu)。
在表格的外侧添加一个可以添加/删除行的按钮。
<p:dataTable resizableColumns="true"
var="sampleDesc" id="SampleDescTable" rowIndexVar="rowIndex"
value="#{sampleBean.sampleDescList.list}"
rendered="#{not empty sampleBean.sampleDescList.list}">
<p:column>
<h:outputLabel value="#{sampleDesc.sampleDescText}"/>
</p:column>
<p:column>
<h:selectOneMenu required="#{not empty sampleBean.sampleDescList.list}" converter="#{sampleDescValueConverter}"
id="SampleDescValue" value="#{sampleBean.selectedSampleDescList[rowIndex]}">
<f:selectItem itemLabel="Select One" itemValue="#{null}"/>
<f:selectItems value="#{sampleDesc.sampleDescValues}" var="sdv"
itemLabel="#{sdv.sampleDescValuesText}" itemValue="#{sdv}" />
</h:selectOneMenu>
</p:column>
</p:dataTable>
上的相关链接