在运行时插入selectOneMenu

时间:2014-09-03 22:36:32

标签: jsf-2 primefaces

是否可以在运行时使用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。

2 个答案:

答案 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>

SO

上的相关链接