我在JSF + JPA应用程序中有双边一对多关系。我想列出视图中列表中仅过滤的项目。在控制器中执行此操作很困难,是否可以像下面那样进行过滤?
<p:selectOneListbox id="cmbField" value="#{investigationItemController.current}" >
<f:selectItems value="#{investigationItemController.currentInvestigation.reportItems}" var="ri" itemLabel="#{ri.name}" itemValue="#{ri}" itemRendered="#{ri.retired ne true and ri.ixItemType eq 'Value'}" />
</p:selectOneListbox>
由于itemRendered不是属性,我尝试了这个,但失败了。
<p:selectOneListbox id="cmbField" value="#{investigationItemController.current}" >
<ui:repeat value="#{investigationItemController.currentInvestigation.reportItems}" var="ri" >
<h:panelGroup rendered="#{ri.retired ne true and ri.ixItemType eq 'Value'}" >
<f:selectItem itemLabel="#{ri.name}" itemValue="#{ri}" />
</h:panelGroup>
</ui:repeat>
</p:selectOneListbox>
所有者实体如下。
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class InvestigationItem extends ReportItem implements Serializable {
private static final long serialVersionUID = 1L;
@OneToMany(mappedBy = "investigationItem", cascade= CascadeType.ALL)
List<InvestigationItemValue> investigationItemValues;
public List<InvestigationItemValue> getInvestigationItemValues() {
return investigationItemValues;
}
public void setInvestigationItemValues(List<InvestigationItemValue> investigationItemValues) {
this.investigationItemValues = investigationItemValues;
}
}
另一个实体如下
@Entity
public class InvestigationItemValue implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
private InvestigationItem investigationItem;
private String name;
//Getters and setters and some other fields
}
控制器类的重要代码集如下
@ManagedBean
@SessionScoped
public final class InvestigationItemController implements Serializable {
private static final long serialVersionUID = 1L;
@EJB
private InvestigationItemFacade ejbFacade;
private InvestigationItem current;
private Investigation currentInvestigation;
// Other code goes here
}
如何在使用f:selectItem或f:JSF / Primefaces中的selectItems时过滤项目?
(我将解释我的真实世界情况,为什么我迫切需要这个功能。
我正在开发医疗应用程序,条款令人困惑。测试或调查(如全血计数或尿液完整报告)可以具有多个属性。测试表示为调查实体。由一个或多个字段组成的测试(如血红蛋白,FBC和颜色的白细胞计数,UFR的外观)。它表示为InvestigationItem。单个InvestigationItem可以具有可能值的列表,在不同的场合中选择哪一个。它们被识别为InvestigationItemValue。所以一个InvestigationItem有一个InvestigationItemValue列表。但是,例如,一些InvestigationItemValues可能是字符串类型,而其他可能是数字。在设计对一种特定类型的新调查时,用户需要选择一个InvestigationItemValue。因此,视图中需要过滤。)
答案 0 :(得分:8)
PrimeFaces <p:selectOneListbox>
实际隐藏<select><option>
并生成<div><ul><li>
,这样可以让您拥有更多CSS样式自由。
您可以使用itemDisabled
属性,然后使用CSS将已停用的项目设置为display: none
。
<p:selectOneListbox ...>
<f:selectItems value="#{investigationItemController.currentInvestigation.reportItems}"
var="ri" itemLabel="#{ri.name}" itemValue="#{ri}"
itemDisabled="#{not ri.retired and ri.ixItemType eq 'Value'}" />
</p:selectOneListbox>
使用此CSS
.ui-selectlistbox-item.ui-state-disabled {
display: none;
}
关于<ui:repeat>
失败的尝试;它失败了,因为在视图构建期间评估<f:selectItem>
,而不是在视图渲染时间期间。但是,<ui:repeat>
在视图渲染时运行。在那一刻,组件树中没有<f:selectItem>
。它应该在视图构建期间附加到UISelectOne
/ UISelectMany
父级。
JSTL在视图构建期间运行,如<f:selectItem>
,因此使用JSTL <c:forEach>
作为循环,<c:if>
作为条件构建(不渲染!)也应该这样做:< / p>
<p:selectOneListbox ...>
<c:forEach items="#{investigationItemController.currentInvestigation.reportItems}" var="ri">
<c:if test="#{not ri.retired and ri.ixItemType eq 'Value'}">
<f:selectItem itemLabel="#{ri.name}" itemValue="#{ri}" />
</c:if>
</c:forEach>
</p:selectOneListbox>
在使用早于2.1.18的Mojarra版本时,您只需要考虑这会破坏视图范围内的bean。