43

<f:selectItem>タグの条件付きレンダリングを指定するにはどうすればよいですか。<f:selectItem>特定のユーザーのステータスに応じてオプションを表示する必要があります。

たとえば、次のようなものが必要でした。

<f:selectItem itemLabel="Yes! I need a girlfriend!"
             rendered="false(or some boolean condition)"
             itemValue="o1"/>
4

8 に答える 8

71

は属性をサポートして<f:selectItem> いません。rendered最も近い賭けはitemDisabled、アイテムを表示しているが選択できない属性です。これはでサポートされてい<f:selectItems>ます。

場合によっては<p:selectOneMenu>、CSSを追加するだけで、無効になっているアイテムを非表示にできます。

<p:selectOneMenu ... panelStyleClass="hideDisabled">
    <f:selectItem itemValue="1" itemLabel="one" />
    <f:selectItem itemValue="2" itemLabel="two" itemDisabled="#{some.condition}" />
    <f:selectItem itemValue="3" itemLabel="three" />
</p:selectOneMenu>
.ui-selectonemenu-panel.hideDisabled .ui-selectonemenu-item.ui-state-disabled {
    display: none;
}

<h:selectOneMenu>WebブラウザがCSSを介して無効なオプションを非表示にすることをサポートしているかどうかに依存している場合は、次のようにします。

<h:selectOneMenu ... styleClass="hideDisabled">
    <f:selectItem itemValue="1" itemLabel="one" />
    <f:selectItem itemValue="2" itemLabel="two" itemDisabled="#{some.condition}" />
    <f:selectItem itemValue="3" itemLabel="three" />
</h:selectOneMenu>
select.hideDisabled option[disabled] {
    display: none;
}

サーバー側の代替手段は<c:if>、個人の周りにJSTL<f:selectItem>を取り込み、次のようにビューに継続的に追加することです(JSFでJSTLがどのように機能するかを知っていることを確認してください:JSF2FaceletsのJSTL...は理にかなっていますか?):

<f:selectItem itemValue="1" itemLabel="one" />
<c:if test="#{not some.condition}">
    <f:selectItem itemValue="2" itemLabel="two"  />
</c:if>
<f:selectItem itemValue="3" itemLabel="three" />

List<SelectItem>または、計算された条件に基づいてバッキングBeanに動的にaを設定し、それをでバインドすることもでき<f:selectItems>ます。

于 2011-08-03T19:35:24.160 に答える
6

私が使用する回避策は、itemDisabled属性を設定し、次のCSSを使用することです。

select option[disabled] { display: none; }

ただし、JSFで適切に修正する必要があります。

于 2012-05-09T06:41:42.140 に答える
3

<c:if>`コンポーネントの繰り返し変数に依存している場合も機能しません(最初のビルドフェーズでは機能しますが、ajaxを使用してforのコレクションを更新します-それぞれが失敗し、一部のアイテムが2回表示され、他のアイテムは表示されません)

これは、JSFの大きな問題の1つです。無効にすることは常にオプションであるとは限りません。このように、このような「簡単な」ことに対処するために、Beanにはさらに多くのコードが必要です。

于 2012-02-18T00:57:19.730 に答える
2

ui:fragmentあなたはそれをコードにラップすることができます:

<ui:fragment rendered="false(or some boolean condition)">
  <f:selectItem itemLabel="Yes! I need a girlfriend!" itemValue="o1"/>
</ui:fragment>

次に、ブール条件がtrueの場合にのみアイテムがレンダリングされます。

于 2015-02-27T11:39:26.647 に答える
1

BalusCの答えに基づいて、新しいバージョンのJSF(私はJSF 2.2を使用しています)では、バッキングBeanリストなしでそれを行うことができます。

        <h:selectOneMenu id="Value" value="#{cc.attrs.value}">
            <f:selectItem itemLabel="#{cc.attrs.placeholder}" noSelectionOption="true">
                <f:passThroughAttribute
                    rendered="#{not empty cc.attrs.placeholder}"
                    name="hidden" value=""/>
            </f:selectItem>
            <f:selectItems value="#{empty cc.attrs.allLabel ? [] : [1]}"
                var="item"
                itemLabel="#{cc.attrs.allLabel}"
                itemValue="#{cc.attrs.allValue}"/>
            <f:selectItems value="#{cc.attrs.codeList}" var="code" itemLabel="#{code.codeDesc}" itemValue="#{code.userCode}"/>
        </h:selectOneMenu>

私はそれをいくつかの特定の要件を持つ複合コンポーネントでラップしました。この質問に関連する部分は、またはのいずれかの値で使用しf:selectItemsています。あなたの条件がそれを使用するとき、それは完全に省略されます、そしてそれが使用するとき、それはあなたが望む値で単一のアイテムを入れます。[][1][][1]

于 2018-03-06T15:18:17.760 に答える
0

私にとって「最もクリーンな」方法は、2019年にJSF 2.3を使用jsf/htmljstl

  1. セットitemDisabled="true"して
  2. を使用したカスタムクラスjsf/passthrough pt:class="hidden"
<f:selectItem itemValue="itsValue" itemLabel="example"
    itemDisabled="#{exampleBean.hideItem}" 
    pt:class="#{exampleBean.hideItem ? 'hidden' : ''}" />

当然のことながら、CSSスタイルが必要です

.hidden {
    display: none !important;
}

これには、リストに無効な要素がまだ存在する可能性があるという利点があります。

于 2019-03-20T13:37:28.480 に答える
0

JS(jQuery)を使用して非表示にすることもできます。Primefacesについて:

$('.ui-selectoneradio .ui-state-disabled').closest('tr').hide();

これはのためp:selectOneRadioです。コンポーネントまたはコンポーネントのコンテナを更新する場合は、コードを再実行する必要があることに注意してください。

于 2021-06-10T09:34:44.803 に答える
-2

私はこれをやって私の問題を解決しました

<p:selectOneRadio id="myId" value="#{myView.myProperty}">
   <h:panelGroup rendered="#{myView.showMyOption}">
      <f:selectItem itemLabel="My Option" itemValue="0"/>
   </h:panelGroup>
   <f:selectItem itemLabel="My Option 1" itemValue="1"/>
   <f:selectItem itemLabel="My Option 2" itemValue="2"/>
</p:selectOneRadio>
于 2015-01-26T18:07:47.780 に答える