2014-09-03 46 views
0

是否有可能在運行時使用JSF創建多個selectOneMenu?在運行時插入selectOneMenu

我的問題是,我想創建另一個selectOneMenu每次用戶選擇一個項目在previousOneMenu。

第一個列表頁面加載時, 這裏我已經試過裝:

<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"); 
    } 

includeCompositeComponentthis 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

如果你的'H的數量鏈接:selectOneMenu'是預定義的,你可以用'rendered',而不是玩嗎? – 2014-09-03 22:42:52

+0

你可以在jsf中使用datatable。在每一行中它都會創建下拉菜單,並且在每個按鈕上單擊它都會添加新行。是不是你想要做的。我對jsf也做過同樣的事情。讓我知道如果你想看到代碼 – 2014-09-04 11:40:11

回答

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")) 
} 
+0

我不知道我必須使用多少選擇,它是根據數據庫中的數據。 – 2014-09-04 11:29:28

+0

你不必知道你將插入多少選擇,只需將它們添加到列表中,它們將顯示在頁面中 – faissalb 2014-09-04 11:31:04

+0

我想你不瞭解我的情況,它們不會同時顯示,每次你從選擇菜單中選擇一個項目,都會添加一個新的選擇。 – 2014-09-04 11:42:20

0

隨着DataTable的,你可以添加你想要的網頁上儘可能多的行(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

+0

,但是一旦渲染值返回false,它就不能再次顯示。 – 2014-09-04 11:58:38

+0

,因爲您可以刪除呈現的條件,或者默認情況下必須在首次調用時生成一個selectmenu。 – 2014-09-04 12:02:39