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 任务中使用第二个-一直显示两个面板... 答案 - 不要使用您说“不刷新页面”在这种情况下有两种方法可以实现: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 感谢您强调这一点。更新了我的答案:-) 我终于成功了 :) 在面板中:这可以通过 ajax 轻松完成:
将<h:panelGroup>
元素放入外部<h:panelGroup>
在<h:selectOneMenu>
内嵌套一个<f:ajax>
,并将外部<h:panelGroup>
的ID 放在其render
属性中。
为每个内部 <h:panelGroup>
元素提供一个 rendered
属性,该属性仅在选择了相应类别时才计算为 true。
【讨论】:
以上是关于JSF 2.0每次从selectOneMenu中选择一个项目时如何显示不同的h:panelGroup的主要内容,如果未能解决你的问题,请参考以下文章
从 JSF 1.2 迁移到 JSF 2.0 后,每次导航都出现 ViewExpiredException
使用ajax从jsf中的primefaces树选定项设置primefaces selectOneMenu默认值
在 SelectOnemenu 上重置 JSF Primefaces 输入值