JSF 2.0每次从selectOneMenu中选择一个项目时如何显示不同的h:panelGroup

Posted

技术标签:

【中文标题】JSF 2.0每次从selectOneMenu中选择一个项目时如何显示不同的h:panelGroup【英文标题】:JSF 2.0 How to display a different h:panelGroup each time an item is selected from a selectOneMenu 【发布时间】:2011-06-26 01:07:08 【问题描述】:

我有一个 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 可以在这里帮助我吗?如果是这样,有人可以告诉我怎么做吗?我一点也不熟悉。

【问题讨论】:

【参考方案1】:

sourceId=null[severity=(ERROR 2), summary=(一个或多个资源的目标是'head',但视图中没有定义'head'组件。), detail=(一个或多个资源的目标是“头”,但视图中没有定义“头”组件。)]

检查你的 head 标签,你可能错过了 h 前缀,写 h:head,我通过使用前缀 h 解决了问题。

【讨论】:

【参考方案2】:

我非常接近解决方案,但出了点问题。我已经按照你说的做了每一件事:第一个和第二个问题都解决了。问题是当我选择类别时面板 carInfo 没有被渲染。

托管 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>

需要显示的JSF面板

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

当我导航到该页面时,一切似乎都正常,但我在控制台中注意到此消息:

信息:警告:FacesMessage(s) 已入队,但可能没有 被显示。 sourceId=null[severity=(ERROR 2), summary=(一个或多个 资源的目标是“头”,但没有“头”组件 在视图中定义。),detail=(一个或多个资源具有 'head' 的目标,但在 查看。)]

【讨论】:

第一个问题-如果页面未刷新,我真的不知道如何获取代表所选值的字符串答案-创建一个新的字符串变量并在 selectOneMenu 任务中使用第二个-一直显示两个面板... 答案 - 不要使用 而是在 panelGroup Quest 3rd 中使用 render="bean.booleanField" - 我实际上应该做什么...在面板中?答案 - 检查新创建的字符串变量的值并做出相应的决定。此外,您可以像使用 JSF2.0 一样使用 您不应将问题发布为答案。编辑您的问题以更新它,或者如果它涉及不同的具体问题,则发布一个新问题。另请参阅***.com/faq。 好的,我会记住这一点,我不会发布问题作为答案。这是我在论坛的第一天,对此感到抱歉。【参考方案3】:

您说“不刷新页面”在这种情况下有两种方法可以实现:1. AJAX:您必须在您的 selectOneMenu 上附加 cartInfo id 和 onChange 事件,这将重新渲染 cartInfo 面板组示例:

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

注意:您必须在 panelGroup 中有一些属性才能在更改事件时评估为 true。

2。 javascript:您可以将面板放在 div 中,并且可以在 onChange 事件中再次显示/隐藏 div。示例:

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

...

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

【讨论】:

OP使用的是JSF2,不一定需要Ajax4jsf。 @BC 感谢您强调这一点。更新了我的答案:-) 我终于成功了 :) 在面板中: ...非常感谢你们!!【参考方案4】:

这可以通过 ajax 轻松完成:

&lt;h:panelGroup&gt; 元素放入外部&lt;h:panelGroup&gt;&lt;h:selectOneMenu&gt; 内嵌套一个&lt;f:ajax&gt;,并将外部&lt;h:panelGroup&gt; 的ID 放在其render 属性中。 为每个内部 &lt;h:panelGroup&gt; 元素提供一个 rendered 属性,该属性仅在选择了相应类别时才计算为 true。

【讨论】:

以上是关于JSF 2.0每次从selectOneMenu中选择一个项目时如何显示不同的h:panelGroup的主要内容,如果未能解决你的问题,请参考以下文章

如何从循环或数组填充JSF selectonemenu

从 JSF 1.2 迁移到 JSF 2.0 后,每次导航都出现 ViewExpiredException

使用ajax从jsf中的primefaces树选定项设置primefaces selectOneMenu默认值

在 SelectOnemenu 上重置 JSF Primefaces 输入值

在 JSF 中向 selectOneMenu 添加“未选择”选项的最佳方法

如何在 JSF 标记 selectOneMenu 中使用转换器? [复制]