1

私は、JSF + JPA アプリケーションで双方向の 1 対多の関係を持っています。ビュー内のリストからフィルターされたアイテムのみを一覧表示したい。コントローラーで行うのは難しいのですが、以下のようにフィルタリングすることはできますか?

<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

}

JSF/Primefaces で f:selectItem または f:selectItems を使用する場合、アイテムをフィルターするにはどうすればよいですか?

(なぜこの機能がどうしても必要なのか、実際の状況を説明します。

私は医療アプリケーションを開発していますが、用語がわかりにくいです。テストまたは調査 (完全な血球数や尿の完全なレポートなど) には、いくつかのプロパティがあります。テストは調査エンティティとして表されます。1 つまたは複数のフィールド (FBC の場合はヘモグロビン、白血球数、UFR の場合は色、外観など) で構成されるテスト。InvestigationItem として表されます。1 つの InvestigationItem に、さまざまな場合に選択される可能性のある値のリストがある場合があります。それらは InvestigationItemValue として識別されます。したがって、1 つの InvestigationItem には InvestigationItemValue のリストがあります。ただし、一部の InvestigationItemValues は文字列型である場合もあれば、数値型である場合もあります。ユーザーは、特定のタイプの新しい調査を設計するときに、1 つの InvestigationItemValue を選択する必要があります。そのため、ビューでフィルタリングが必要です。)

4

1 に答える 1

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 は のようにビューのビルド時に実行されるため、ループと条件付きのビルド (レンダリングではありません!) に JSTL を使用することもできます<f:selectItem><c:forEach><c:if>

<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 が壊れることだけを考慮する必要があります。

以下も参照してください。

于 2013-07-13T22:04:47.690 に答える