43

ユーザーがselectOneMenuで何も選択できないようにするための最良または最も簡単な方法は何だろうと思っていました。

私の例: 登録済みユーザーのリストがあり、管理者は表示されたユーザーのリストをいくつかの基準でフィルタリングできるはずです。ユーザータイプ (従業員、顧客など) などのこれらの基準は、次のように selectOneMenus で選択できます。

<h:selectOneMenu value="#{myBean.selectedUsertype}" converter="#{usertypeConverter}">
<f:selectItems value={myBean.usertypes}" />
</h:selectOneMenu>

When the corresponding selectOneMenu is being backed by a list of POJOs using a converter, how can I add an item to the list indicating that the user didn't choose any specific item? Currently I have a dummy usertype object displaying the label "---", but this is causing several problems in other areas of my application and I don't think that this is the best solution.

4

3 に答える 3

103

選択項目の値を明示的に に設定するだけnullです。

<h:selectOneMenu value="#{bean.selectedItem}">
    <f:selectItem itemValue="#{null}" itemLabel="--select--" />
    <f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>

いいえ、空文字列のようなものitemValue=""では不十分です。それは本当にする必要がありますnull。そうしないと、この Q&A: Using a "Please select" f:selectItem with null/empty value within ap:selectOneMenuで説明されているように問題が発生します。

アイテムがたまたまありrequired="true"、JSF 2.x を使用している場合は、選択アイテムに追加できます。noSelectionOption="true"これは、選択コンポーネント設定する場合にのみ役立ちます。エンドユーザーが別のアイテムを選択すると、リスト内の空のオプションが非表示になり、空のオプションを再度選択することができなくなります。hideNoSelectionOption="true"

<h:selectOneMenu value="#{bean.selectedItem}" hideNoSelectionOption="true">
    <f:selectItem itemValue="#{null}" itemLabel="--select--" noSelectionOption="true" />
    <f:selectItems value="#{bean.availableItems}" />
</h:selectOneMenu>

The Definitive Guide to JSFのセクション「SelectItem tags」の114 ページも参照してください。

選択コンポーネントの属性に#{null}関連付けられた Bean プロパティが の場合、値が の選択項目を使用してデフォルトの選択を表示できることに注意してください。のタグ ドキュメントを調べた場合は、この属性に気づき、「選択オプションなし」を表すことを意図したものだと考えたことがあるでしょう。実際、これは真実ではありません。多くのフォーラム、Q&A サイト、およびインターネット上の質の悪いチュートリアルでわかるように、多くの初心者は確かにそう考えています。誤解を招く属性名にもかかわらず、「選択オプションなし」を表すものではありません。valuenull<f:selectItem>noSelectionOption

より良い属性名は だったでしょうがhideWhenOtherOptionIsSelected、それでも、親選択コンポーネントが明示的にhideNoSelectionOption="true"属性セットを持っている場合にのみ機能します。したがって、hideWhenOtherOptionIsSelectedAndHideNoSelectionOptionIsTrue最終的には最も自明な属性名でした。noSelectionOption残念ながら、 JSF 1.2 で が実装されたとき、これはあまりよく考えられていませんでした。この属性が機能するために 2 つの属性を要求する必要はありませんでした。この属性ペアの主な目的は、コンポーネントですでに非null値が選択されている場合に、Web サイトのユーザーが「選択なしオプション」を再選択できないようにすることです。たとえば、メソッドで準備するか、非値@PostConstructでフォームを送信した後にコンポーネントを再レンダリングします。null

著作権の免責事項: 本は私によって書かれています。

于 2012-07-09T14:48:57.633 に答える
10

null値を持つ単一のselectItemを追加します。

<h:selectOneMenu value="#{bean.question}" required="true" requiredMessage="Please select a question">
    <f:selectItem itemValue="#{null}" itemLabel="Select" />
    <f:selectItems value="#{bean.questions}" />
</h:selectOneMenu>
于 2012-07-06T10:28:18.813 に答える