2011-02-12 48 views
2

選擇每次我有一個顯示一些不同的東西的類別一個selectOneMenu用於:JSF 2.0如何顯示不同的H:panelGroup中的項是從一個selectOneMenu用於

<h:selectOneMenu value="#{searchController.selectedCategory}"> 
     <f:selectItems value="#{searchController.formatedCategories()}" >    
     </f:selectItems> 
    </h:selectOneMenu> 

我需要顯示取決於不同panelGroup中選定的類別。 示例(這其中需要顯示時,選擇第一項時)

<h:panelGroup id="carInfo"> 
     <h:outputText value="marka" /> 
     <h:selectOneMenu> 
      <f:selectItems value="#{searchController.formatedCarMarks()}" /> 
     </h:selectOneMenu> 
     <h:outputText value="godina" /> 
     <h:selectOneMenu> 
      <f:selectItems value="#{searchController.formatedYearFrom()}" /> 
     </h:selectOneMenu> 
     <h:selectOneMenu> 
      <f:selectItems value="#{searchController.formatedYearTo()}" /> 
     </h:selectOneMenu> 
     <h:outputText value="kms.:" /> 
     <h:selectOneMenu> 
      <f:selectItems value="#{searchController.kmsFrom()}" /> 
     </h:selectOneMenu> 
     <h:selectOneMenu> 
      <f:selectItems value="#{searchController.kmsTo()}" /> 
     </h:selectOneMenu> 
    </h:panelGroup> 

我不知道如何做到這一點,因爲我需要走出刷新頁面來做到這一點。 任何想法? Ajax能幫助我嗎?如果有的話可以有人告訴我怎麼樣?我根本不熟悉。

回答

3

這很容易通過AJAX來完成:

  • <h:panelGroup>元素外<h:panelGroup>
  • <h:selectOneMenu>內的<f:ajax>內,把外<h:panelGroup>的ID在其render屬性。
  • 給每個內部<h:panelGroup>元素一個rendered屬性,只有在選擇了相應的類別後,該屬性的值纔會爲真。
3

你說「沒有刷新頁面」,在這種情況下,有2種方式,你可以做到這一點:
1 AJAX:你必須附上cartInfo ID與onChange事件您selectOneMenu用於
這將重新呈現cartInfo panelGroup中
例子:

<h:selectOneMenu value="#{searchController.selectedCategory}"> 
     <f:selectItems value="#{searchController.formatedCategories()}" >    
     </f:selectItems> 
     <f:ajax event="change" execute="@this" render="cartInfo"/> 
    </h:selectOneMenu> 

注:你必須有在panelGroup中的一些屬性eveluate到TR在變化事件上。

2. JavaScript:你可以讓你的Panel在div中,並且可以在onChange事件上再次顯示/隱藏div。
例子:

<h:selectOneMenu value="#{searchController.selectedCategory}" onChnage="javascript: showDivFunction()"> 

...

<div id="divCartInfo" style="display:none"> 
<h:panelGroup id="carInfo"> 
..... 
</div> 
+1

OP正在使用JSF2,您不一定需要Ajax4jsf。 – BalusC 2011-02-12 13:10:49

+0

@BC Thx突出顯示。更新我的回答:-) – JSS 2011-02-12 13:44:44

1

我非常接近的解決方案,但什麼是錯的。如你所說,我已經完成了所有事情:第一個和第二個問題都解決了。問題在於,當我選擇類別時,面板carInfo不會呈現。

託管bean中的方法有什麼問題嗎? 由於某種原因,它不會被調用。 這是我的代碼目前看起來像 Managed Bean的

public void carSelectedEvent(ValueChangeEvent e) { 
    String tmp = (String) e.getNewValue(); 
    System.out.println("CALLED!!!!!"); 
    if (selectedCategory.trim().equals("automobili")) { 
     carCategorySelected = true; 
    } else if (e.getNewValue().toString().contains("NEKRETNINE")) { 

    } 
} 

JSF頁面選擇

<h:selectOneMenu value="searchController.selectedCategory"> 
     <f:selectItems value="#{searchController.formatedCategories()}" ></f:selectItems> 
     <f:ajax event="change" action="searchController.carSelectedEvent" render="carInfo"/> 
    </h:selectOneMenu> 
需要顯示

<h:panelGroup id="carInfo" rendered="searchController.carCategorySelected"> 
... 

當我瀏覽網頁everithing

JSF面板似乎確定,但我注意到在控制檯中的這條消息:

信息:警告:FacesMessage(s)已被排隊,但可能沒有 顯示。 sourceId = null [severity =(ERROR 2),summary =(一個或多個 資源具有'head'的目標,但沒有'head'組件在視圖中定義了 。),detail =(一個或多個資源有 '頭部' 的 目標,但是沒有 '頭部' 分量已被該 視圖中定義的。)]

1

的SourceID = NULL [嚴重性=(ERROR 2),彙總=(一個或多個資源有在視圖中已經定義了'head'的目標,但沒有定義'head'組件。),detail =(一個或多個資源的目標是'head',但在視圖內沒有定義'head'組件。 )]

檢查你的頭標籤,你可能有錯過了h前綴,寫下h:head,我用前綴h解決了這個問題。

相關問題