2

検証が失敗した後にコンポーネントのスタイルを設定するにはどうすればよいですか?

次のテキストフィールドがあります。

<p:inputText id="username" value="#{authController.username}" autocomplete="off" required="true" />

次の後に色を変更しようとしています:

<p:commandButton id="submit" value="Login" actionListener="#{authController.login}" update=":growl" />

クリックされます。

このサイトを見つけて、そこに示されている方法を実装しようとしました。

これは私のクラスです:

public class RequiredFieldValidationListener implements SystemEventListener {

    public boolean isListenerForSource(Object source) {
        return true;
    }

    public void processEvent(SystemEvent event) throws AbortProcessingException {
        if (event.getSource() instanceof UIInput) {
            UIInput source = (UIInput) event.getSource();

            if (!source.isValid()) {
                String originalStyleClass = (String) source.getAttributes().get("styleClass");
                source.getAttributes().put("data-originaStyleClass", originalStyleClass);
                source.getAttributes().put("styleClass", originalStyleClass + " ui-input-invalid");
            } else {
                String originalStyleClass = (String) source.getAttributes().get("data-originaStyleClass");
                source.getAttributes().put("styleClass", originalStyleClass);
            }
        }
    }
}

私はそれを次のように登録してfaces-config.xmlいます:

<application>
    ---

    <system-event-listener>
        <system-event-listener-class>com.edfx.adb.web.event.RequiredFieldValidationListener</system-event-listener-class>
        <system-event-class>javax.faces.event.PostValidateEvent</system-event-class>
        <source-class>javax.faces.component.html.HtmlInputText</source-class>                       
    </system-event-listener>

</application>

また、私は使用しようとしました

@ListenersFor({ @ListenerFor(sourceClass = HtmlInputText.class, systemEventClass = PostValidateEvent.class) })
public class RequiredFieldValidationListener implements SystemEventListener {

}

入力フィールドが無効な場合、私の場合は空白で、css クラス ui-input-invalid がコンポーネントのクラス属性に追加されることを期待していました。しかし、それは機能していません。実際、メソッドprocessEventはまったく実行されていません。

私が間違っていることと、どうすればこれを達成できますか?

4

2 に答える 2

4

ajaxリクエストの完了時に入力コンポーネントを更新しなかったため、具体的な問題が発生しました。あなたはうなり声コンポーネントを更新しているだけです。そのため、入力コンポーネントへの変更がクライアント側に反映されることはありません。

強調表示する必要がある他の入力コンポーネントが含まれている可能性があるため、フォーム全体を更新することをお勧めします。

<p:commandButton ... update="@form" />

ちなみに、@ListenersFor(と@ListenerFor)はここで間違っています。そのようには機能せず、それらは単純に無視されます。それらを取り除きます。すべての UIInputs に対して (Component)SystemEventListener を登録する方法も参照してください。


具体的な問題とSystemEventListenerは関係ありませんが、失敗した入力コンポーネントを強調するこのアプローチには欠陥があります。入力コンポーネントが<ui:repeat>またはなどの反復コンポーネント内にある場合、失敗します<h:dataTable>。そのうちの 1 つだけが失敗した場合でも、すべての行の入力コンポーネントが強調表示されます。

代わりに、クライアント側のアプローチを採用することをお勧めします。JSF ユーティリティ ライブラリOmniFaces<o:highlight>は、まさにこの目的のためのコンポーネントを提供します。タグのドキュメント、ショーケース<o:highlight>ソース コード参照してください。<o:highlight><o:highlight>

于 2012-12-09T13:52:26.950 に答える
1

リンクされた例を試し、使用時に SystemEventListener.processEvent() をトリガーするようにしました

<h:inputText ... required="true"/>

だから私はそれがfaces-config.xmlに関係していると考えました。source-class として素数の InputText を指定すると、うまくいきました。

<application>
    <system-event-listener>
        <system-event-listener-class>RequiredFieldValidationListener</system-event-listener-class>
        <system-event-class>javax.faces.event.PostValidateEvent</system-event-class>
        <source-class>org.primefaces.component.inputtext.InputText</source-class>
    </system-event-listener>
</application>

使用する

<p:inputText ... required="true"/>
于 2012-12-09T07:33:01.823 に答える