2011-02-12 55 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解决了这个问题。

相关问题