5

基本的な登録画面(ボタン登録で画面を記録)には、2つのパネルがあります。

データパネル:

ここに画像の説明を入力してください

アドレスパネル:

ここに画像の説明を入力してください

データパネルだけで登録できます。アドレスパネルに入力する必要はありません。ただし、アドレスパネルの少なくとも1つのフィールドが入力されている場合は、同じパネルの他のすべてのフィールドが必要です。

ここに画像の説明を入力してください

どうすればこれを達成できますか?

4

2 に答える 2

7

required他の入力が空でない値を送信した場合は、属性をチェックインする必要があります。これによりかなりの定型文が作成される可能性があるため、入力コンポーネントが3つしかないキックオフの例を次に示します。

<h:form id="form">
    <h:inputText id="input1" value="#{bean.input1}" required="#{empty param['form:input2'] and empty param['form:input3']}" />
    <h:inputText id="input2" value="#{bean.input2}" required="#{empty param['form:input1'] and empty param['form:input3']}" />
    <h:inputText id="input3" value="#{bean.input3}" required="#{empty param['form:input1'] and empty param['form:input2']}" />
</h:form>

別の方法は、コンポーネントをビューにバインドしUIInput#getValue()、前のコンポーネントの値UIInput#getSubmittedValue()をチェックし、次のコンポーネントをチェックするために使用することです(つまり、コンポーネントは、コンポーネントツリーに表示される順序で処理されます)。このように、クライアントIDをハードコーディングする必要はありません。バインディング名が既存のマネージドBean名と競合しないことを確認する必要があるだけです。

<h:inputText binding="#{input1}" value="#{bean.input1}" required="#{empty input2.submittedValue and empty input3.submittedValue}" />
<h:inputText binding="#{input2}" value="#{bean.input2}" required="#{empty input1.value and empty input3.submittedValue}" />
<h:inputText binding="#{input3}" value="#{bean.input3}" required="#{empty input1.value and empty input2.value}" />

コンポーネントが増えると、これによって醜い定型文が作成されることがわかります。JSFユーティリティライブラリOmniFacesには<o:validateAllOrNone>、正確な目的のためのバリデーターがあります。ライブデモもご覧ください。quesitonタグに基づいて、OmniFacesを使用しているため、次のように設定されているはずです。

<o:validateAllOrNone components="input1 input2 input3" />
<h:inputText id="input1" value="#{bean.input1}" />
<h:inputText id="input2" value="#{bean.input2}" />
<h:inputText id="input3" value="#{bean.input3}" />
于 2013-01-22T14:34:12.580 に答える
1

まず、バッキングBeanに次のようなメソッドを追加する必要があります。

public boolean isAddressPanelRequired() {
    // Check if at least one field is entered
    // and return true if it is and false othervise
}

アドレスパネルの各入力要素には、required="#{backingBean.addressPanelRequired}"

次に、そのコンポーネントを処理するアドレスパネルの各入力コンポーネントにonblur ajaxリスナーを追加し、アドレスパネルを更新します。

于 2013-01-22T12:54:38.540 に答える