1

必要なときに何らかの方法で ap:selectOneRadio が強調表示されるようにしたいのですが、何も選択されていません。現在、ページの上部にエラー メッセージが追加されますが、エラー クラスはどのコンポーネントにも追加されません。これにより、多くの入力がある場合に、ユーザーが問題を見つけることがより困難になります。

編集:例に追加情報を追加

<div class="options-item r">
<fieldset class="default-radio">
    <legend for="default_radio_id" class="legend-txt">
        <span class="required c">*</span>#{msg['label.legend']}
    </legend>
    <p:selectOneRadio id="default_radio_id"
                  label="#{msg['label']}" required="true"
                  layout="custom"
                  value="#{bean.value.defaultIsFalse}">
        <f:selectItem itemLabel="#{msg['label.option1']}"
                      itemValue="#{true}"/>
        <f:selectItem itemLabel="#{msg['label.option2']}"
                      itemValue="#{true}"/>
    </p:selectOneRadio>
    <h:panelGrid styleClass="some_class another_radio_class" columns="4">
        <p:radioButton id="opt1aa" for="default_radio_id" itemIndex="0"/>
        <h:outputLabel styleClass="txt" for="opt1aa"
                       value="#{msg['label.option1']}"/>

        <p:radioButton id="opt1bb" for="default_radio_id" itemIndex="1"/>
        <h:outputLabel styleClass="txt" for="opt1bb"
                       value="#{msg['label.option2']}"/>
    </h:panelGrid>

    <!-- some other non relevant things? -->
</fieldset>
</div>

私はprimefaces 3.5を使用しています

「ui-state-error」などのある種のエラー クラスが無線選択に追加されることを確認する方法はありますか? または、欠落している無線選択を識別するために使用される他のパターンがありますか?

Edit2: ソリューションの追加の Bean 定義を追加

知らない人のために説明すると、これは、ソリューションを機能させるために Bean 定義に加える必要がある種類の変更です。

private UIInput radioButton;
public UIInput getRadioButton() {
    return radioButton;
}

public void setRadioButton(UIInput radioButton) {
    this.radioButton = radioButton;
} 

Edit3: Edit2 にコメントを追加し、ソリューションを完成させました

バインディングをラッチするために、既存のバッキング Bean で UIInput を定義する必要がないことがわかりました。Bean 自体から既存の Bean にアクセスする必要がある場合は、既存の Bean の 1 つだけを編集する必要があります。

解決:

<div class="options-item r">
<fieldset class="default-radio">
    <legend for="default_radio_id" class="legend-txt">
        <span class="required c">*</span>#{msg['label.legend']}
    </legend>
    <p:selectOneRadio id="default_radio_id" binding="#{anyUnusedBeanName}"
                  label="#{msg['label']}" required="true"
                  layout="custom"
                  value="#{bean.value.defaultIsFalse}">
        <f:selectItem itemLabel="#{msg['label.option1']}"
                      itemValue="#{true}"/>
        <f:selectItem itemLabel="#{msg['label.option2']}"
                      itemValue="#{true}"/>
    </p:selectOneRadio>
    <h:panelGrid styleClass="some_class another_radio_class #{anyUnusedBeanName.valid ? '' : 'ui-state-error'}" columns="4">
        <p:radioButton id="opt1aa" for="default_radio_id" itemIndex="0"/>
        <h:outputLabel styleClass="txt" for="opt1aa"
                       value="#{msg['label.option1']}"/>

        <p:radioButton id="opt1bb" for="default_radio_id" itemIndex="1"/>
        <h:outputLabel styleClass="txt" for="opt1bb"
                       value="#{msg['label.option2']}"/>
    </h:panelGrid>

    <!-- some other non relevant things? -->
</fieldset>
</div>
4

2 に答える 2

0

再現できます。PrimeFaces の単なるレンダリング バグのように見えます。親が検証に失敗した場合に備えて、設定ui-state-errorするのを忘れていました。他の誰かがまだこの問題を報告していない場合は、この問題を報告することをお勧めします。<p:radioButton><p:selectOneRadio>

それまでの間、レンダラーを書き換えてオーバーライドする以外に、次のようにスタイル クラスを手動で指定することをお勧めします。

<p:selectOneRadio binding="#{defaultRadioId}" ... />
...
<p:radioButton ... styleClass="#{defaultRadioId.valid ? '' : 'ui-state-error'}" />

ここでの秘訣は、コンポーネントをビューにバインドして、プロパティUIInputを確認できるインスタンスとして別の場所で使用できるようにすることです。UIInput#isValid()

必要に応じて CSS でルックアンドフィールを微調整し.ui-radiobutton.ui-state-error {}ます。

于 2013-08-14T19:49:24.170 に答える
-1

このサーバー側を実行している場合、最善の策は、対応するものへのアクセスを取得することですUIComponent(バインディングまたは静的メソッドのいずれかによって)。UIInput次に、 (必要に応じて) にキャストし、 setValid()メソッドを呼び出して に渡しますfalse

于 2013-08-13T01:46:23.973 に答える