f中的筛选值:选择JSF/Primefaces中的项目

f中的筛选值:选择JSF/Primefaces中的项目,jsf,jpa,primefaces,Jsf,Jpa,Primefaces,我在JSF+JPA应用程序中有双边的一对多关系。我只想在视图中列出列表中已过滤的项目。在控制器中执行此操作很困难,是否可以像下面那样进行过滤 <p:selectOneListbox id="cmbField" value="#{investigationItemController.current}" > <f:selectItems value="#{investigationItemController.currentInvestigation.reportIte

我在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>
控制器类的重要代码集如下所示

@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

}
在JSF/Primefaces中使用f:selectItem或f:selectItems时,如何过滤项目

(我将解释我的真实情况,为什么我迫切需要这个功能

我正在开发一个医疗应用程序,术语令人困惑。测试或调查(如全血计数或尿液完整报告)可能有几个属性。测试被表示为一个调查实体。测试由一个或多个字段组成(如血红蛋白、FBC的白细胞计数和UFR的颜色、外观)。它表示为调查项目。单个调查项目可能有一个可能值列表,其中一个在不同情况下被选择。它们被标识为调查项目值。因此,一个调查项目有一个调查项目值列表。但是,例如,一些调查项目值可能是字符串类型,而另一些是数字类型。用户在设计一个特定类型的新调查时需要选择一个调查项目值。因此,需要在视图中进行筛选。)PrimeFaces
实际上隐藏了
,并生成了一个
,这允许您更自由地进行CSS样式设置

您只需使用
itemsabled
属性,然后使用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>
关于您尝试使用
失败的原因;它失败,因为
是在视图生成时计算的,而不是在视图渲染时计算的。但是,
在视图渲染期间运行。在此期间,
在组件树中不可用。它应该在视图构建期间附加到
UISelectOne
/
UISelectMany
父级

JSTL在视图构建期间运行,如
,因此,对循环使用JSTL
,对条件构建(不渲染!)使用JSTL也应该这样做:

<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

另见:
PrimeFaces
实际上隐藏了
,并生成了一个
,允许您更自由地进行CSS样式设置

您只需使用
itemsabled
属性,然后使用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>
关于您尝试使用
失败的原因;它失败,因为
是在视图生成时计算的,而不是在视图渲染时计算的。但是,
在视图渲染期间运行。在此期间,
在组件树中不可用。它应该在视图构建期间附加到
UISelectOne
/
UISelectMany
父级

JSTL在视图构建期间运行,如
,因此,对循环使用JSTL
,对条件构建(不渲染!)使用JSTL也应该这样做:

<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

另见:

为什么在控制器中很难执行此操作?对我来说,这听起来像是控制器的常规任务。或者你只是好奇你如何能在视图中做到这一点?我已经尽可能多地在问题的编辑中解释了。如果我们有一个类似于f:selectItems中呈现的属性,我可以很容易地实现这个功能。无论如何,请转到omnifaces google代码项目问题列表,并在那里添加一个功能请求。另外,请参阅阅读此问题。有人在他们的项目中添加了渲染器来修复此问题。您始终可以将渲染器添加到项目中,以修复。在我之前的评论中,即stackoverflow问题中,有人说他们使用的是MyFaces 2.1.7,MyFaces 2.1.7 UISelectItem具有“rendered”属性。您始终可以向Mojarra和MyFaces JIRA/issue列表添加功能请求,要求他们向f:selectItem和f:selectItems添加“呈现”属性。为什么在控制器中很难做到这一点?对我来说,这听起来像是控制器的常规任务。或者你只是好奇你如何能在视图中做到这一点?我已经尽可能多地在问题的编辑中解释了。如果我们有一个类似于f:selectItems中呈现的属性,我可以很容易地实现这个功能。无论如何,请转到omnifaces google代码项目问题列表,并在那里添加一个功能请求。另外,请参阅阅读此问题。有人在他们的项目中添加了渲染器来修复此问题。您始终可以将渲染器添加到项目中,以修复。在我之前的评论中,即stackoverflow问题中,有人说他们使用的是MyFaces 2.1.7,MyFaces 2.1.7 UISelectItem具有“rendered”属性。您可以随时向Mojarra和MyFaces JIRA/问题列表添加功能请求,要求他们向f:selectItem和f:selectItems添加“呈现”属性。非常感谢。你是个救生员。这两种方法对我来说都有可能解决这个问题。非常感谢。你是个救生员。这两种方法对我来说都有可能解决这个问题。
<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>