7

私のアプリケーションにはp:selectOneMenu、A、B、Cなどの3つのドロップダウンメニュー()があります。そのうちの2つは、BとCなどに依存しています。BIの値を変更すると、値が動的にCに読み込まれます。テキストボックスもあります。テキストボックスの値は、on-changeイベントがこれらの3つのドロップダウンから発生しているときに、ajaxによって生成されます。

これがxhtmlです:

<p:selectOneMenu id="customerMenu" value="#{adminController.activityDTO.customerId}" required="true" label="Customer Name" style="width: 200px">
    <f:selectItem itemLabel="Select One" itemValue="" />
    <f:selectItems value="#{adminController.customers}" var="customer" itemLabel="#{customer.customerName}" itemValue="#{customer.customerId}" />
    <p:ajax listener="#{adminController.generateActivityName}" update="activityId" />                       
</p:selectOneMenu>

<p:selectOneMenu id="activityTypeMenu" value="#{adminController.activityDTO.activityParentType}" required="true" label="Activity Type"
    style="width: 200px">
    <f:selectItem itemLabel="Select One" itemValue="" />
    <f:selectItems value="#{adminController.activityTypes}" var="activityType" itemLabel="#{activityType.parent}" itemValue="#{activityType.parent}" />
    <p:ajax listener="#{adminController.updateDependentActivity}" update="activitySubType" />
</p:selectOneMenu>

<p:selectOneMenu id="activitySubTypeMenu" value="#{adminController.activityDTO.activitySubType}" required="true" label="Activity Sub Type"
    style="width: 200px">
    <f:selectItem itemLabel="Select One" itemValue="" />
    <f:selectItems value="#{adminController.activitySubTypes}" var="activityType" itemLabel="#{activityType.name}" itemValue="#{activityType.id}" />
    <p:ajax listener="#{adminController.generateActivityId}" update="activityId" />
</p:selectOneMenu>

<p:inputText id="activityId" autocomplete="off" readonly="true" value="#{adminController.activityDTO.activityId}"
    label="#{adbBundle['admin.addActivityPanel.addActivityTable.activityId']}" required="true" />

activityTypeMenuとは、私が入力activitySubTypeMenuしているの選択された値によって依存します。activityTypeMenuactivitySubTypeMenu

今私が直面している問題は次のとおりです。

  • で「外部」と「内部」を選択しactivityTypeMenu、デフォルトで「1つ選択」したとします。から「外部」を選択activityTypeMenuするactivitySubTypeMenuと、「プロジェクト」と「サービス」が表示されます。ただし、デフォルトの「Select One」を選択した場合activitySubTypeMenuでも、以前に動的に入力された値が保持されます。これはrequired="true"、動的な値をロードしているバックエンドメソッドの起動に抵抗する属性が原因です。
  • をに設定しようとしましたがitemValue、「1つ選択」オプションを選択するとバックエンドメソッドが起動します。空のリストをに設定すると、この方法で空になります。しかし、その場合、は無意味になります。つまり、保存ボタンがあり、オプションを選択せず​​に(つまり、「1つ選択」を選択して)そのボタンをクリックすると、スローされず、コンポーネントはPrimefacesのエラーcssクラスによってスタイル設定されません。<f:selectItem itemLabel="Select One" itemValue="" />#{null}activitySubTypesactivitySubTypeMenurequired="true"activityTypeMenuactivitySubTypeMenuValidatorException
  • itemValueまた、を設定<f:selectItem itemLabel="Select One" itemValue="" />しないと#{null}、選択した値をデフォルトのオプション(「1つ選択」)に変更しても、がクリアされませんactivityId p:inputText。を使用する#{null}と、バックエンドメソッドを起動して、テキストボックスの値を空に設定できます。

この問題をどのように解決し、望ましい結果を得ることができますか。私が欲しいのは:

  • オプションが「1つ選択」に設定されている場合、依存メニューは空になり、テキストボックスのメニューになります。
  • required="true"属性を使いたい。
4

1 に答える 1

10

required属性でELを使用できます。true特定の送信ボタンが押されたとき、または特定のコンポーネント値が送信されたとき(したがって、要求パラメーターマップに存在するクライアントIDによって)にのみ、目的の式を評価させることができます#{param}

次のキックオフの例は、必要なことを実行するはずです。

<p:selectOneMenu binding="#{menu1}" ... required="#{not empty param[submit.clientId]}">
    ...                       
</p:selectOneMenu>
<p:selectOneMenu ... required="#{not empty param[menu1.clientId]}">
    ...                       
</p:selectOneMenu>
<p:commandButton binding="#{submit}" ... />

このように、1番目のメニューはフォームのメイン送信ボタンが押されたときにのみ必要であり(したがって、イベントリスナーが起動されたときは必要ありません)、2番目のメニューは1番目のメニューに値がある場合にのみ必要です。

于 2013-01-26T17:44:49.407 に答える