2

IceFacesフォームといくつかの入力フィールドがあります。

私がこれを持っているとしましょう:

<ice:selectOneMenu id="accountMenu"
    value="#{accountController.account.aId}"
    validator="#{accountController.validateAccount}">
    <f:selectItems id="accountItems"
            value="#{accountController.accountItems}" />
</ice:selectOneMenu>

この:

<ice:selectOneMenu id="costumerMenu"
    value="#{customerController.customer.cId}"
    validator="#{customerController.validateCustomer">
    <f:selectItems id="customerItems"
            value="#{customerController.customerItems}" />
</ice:selectOneMenu>

1つの値を変更すると、それぞれのバリデーターが呼び出されます。しかし、他のバリデーターも呼び出されますが、これは問題ありません。ユーザーは、注意を向けようとしていたフィールドに値を挿入するという苛立たしいメッセージを受け取るからです。これは、「今すぐ急いで!」というスティックでユーザーを突くようなものです。悪い!

属性「partialSubmit」がこの動作を制御していると思ったので、1つのDOMパーツのみが送信され、ユーザーの操作の影響を受けますが、両方のコンポーネントを部分的に送信するように宣言しても、何も変わりません。それでも、1つのコンポーネント値が変更されると、両方のバリデーターが呼び出されます。

完全に送信されるまでフォーム全体が検証されないようにするにはどうすればよいですか?

4

2 に答える 2

5

部分的な送信が実行されても、完全なJSFライフサイクルは引き続き実行されます。したがって、検証フェーズは引き続き処理され、コンポーネント階層内のすべてのコンポーネントが検証されます。

これには正当な理由があります。あるコンポーネントを変更すると、別のコンポーネントに(無効になる可能性のある)変更が発生する可能性があります。たとえば、から選択するとselectOneMenu、に値を設定できますinputText

ICEfacesは、1つの重要な方法で処理を変更します。部分的な送信中に、ICEfacesは、sumbitをトリガーしたコンポーネント以外のすべてのコンポーネントをオプションとして一時的にマークします(required="false")。したがって、「必須」の検証はスキップされます。ただし、ICEfacesは他の検証を無効にしません。

この問題には2つの解決策があります。

  1. immediate="true"に加えて設定しpartialSubmitます。これにより、部分送信が実行されて要求値の適用フェーズで検証が実行されるときに、コンポーネントのライフサイクルがわずかに変更されます。これにより、他の検証がスキップされる可能性があります。

  2. カスタムバリデーターで部分的な送信が発生したかどうかを検出します。部分的な送信をトリガーしたコンポーネントでない場合は、検証をスキップします。残念ながら、部分的な送信を検出する方法に関するドキュメントはありませんが、com.icesoft.faces.application.PartialSubmitPhaseListenerクラスのソースコードで解決策を見つけました。

    部分的な送信が実行されると、ICEfacesは2つの要求パラメーターを追加することがわかりました。

    • ice.submit.partial-「true」に設定して、部分的な送信が行われたことを示します。
    • ice.event.captured-部分送信を生成したコンポーネントのコンポーネントIDが含まれます。

検証メソッドでこれら2つのパラメーターを利用できます。次に例を示します。

public void validateAccount(FacesContext context, 
  UIComponent component, Object value) 
{
  if(!partiallySubmitted(context) || 
     componentWasPartiallySubmitted(context, component)
    // Perform validation
  }

}

public boolean partiallySubmitted(FacesContext context) {
    ExternalContext externalContext = context.getExternalContext();
    Map parameterMap = externalContext.getRequestParameterMap();   

    return "true".equals(parameterMap.get("ice.submit.partial"));
}

public boolean componentWasPartiallySubmitted(FacesContext context, 
  UIComponent component) {
    ExternalContext externalContext = context.getExternalContext();
    Map parameterMap = externalContext.getRequestParameterMap();   

    String componentId = (String) parameterMap.get("ice.event.captured");

    return component.getClientId(context).equals(componentId);
}

もちろん、2つのリクエストパラメータに直接アクセスすることはおそらくサポートされていません。ただし、ICEfacesチームが部分的な送信を「検出」するためのサポートされた方法を提供するまでは、それが唯一の選択肢である可能性があります。

于 2010-05-12T01:16:01.203 に答える
0

イベントでajax検証を実行してみてくださいonblur(icefacesでそれを行う方法はわかりませんが、richfacesでは単に<a4j:support event="onblur" />

于 2010-05-11T18:59:51.283 に答える