过滤f中的值:JSF / Primefaces中的selectItems

时间:2013-07-12 09:23:59

标签: jsf jpa primefaces

我在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。因此,视图中需要过滤。)

1 个答案:

答案 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。

另见: