1

驚いたことに、テキストボックスに入力した各キーの後にajax呼び出しが発生していません。ajaxは、 14桁が入力された後にのみ呼び出されます。この場合、ajaxがvalidateRegexタグハンドラーにどのように関連しているかわかりませんか?また、etcは常にクライアント側で検証を実行すると言うことができ<f:validateRegex>, <f:valiadteLength>ますか(javascript / jqueryなど)?

<h:inputText id="input" value="#{bean.input}" maxlength="16">
<f:ajax event="keyup" render="another_id" listener="{bean.method}"/>
<f:validateRegex pattern="[0-9]{14}" />
</h:inputText>
4

1 に答える 1

2

テキストボックスに入力した各キーの後にajax呼び出しが発生していません。ajaxは、14桁が入力された後にのみ呼び出されます

いくつかの混乱が起こっています。上記の記述は正しくありません。

ajax呼び出しは確実に呼び出されます。Webブラウザの組み込み開発者ツールセットでHTTPトラフィックを追跡します(Chrome / IE9 / FirebugでF12を押して、[ネットワーク]セクションを確認します)。/*またはJSFでHTTPフィルターを作成するPhaseListenerと、キーを押すたびに呼び出されていることがわかります(つまり、サーバーは毎回確実にヒットします)。

おそらく実際には、で指定されているアクションリスナーメソッド<f:ajax listener>が呼び出されていないことを意味しています。それは確かに真実です。しかし、それは完全に予想される動作です。つまり、検証エラーがあります。このようにして、JSFはUPDATE_MODEL_VALUESフェーズとINVOKE_ACTIONフェーズをスキップします。したがって、アクションメソッドは設計上実際には呼び出されません。つまり、検証エラーがある場合は、ビジネスロジックを実行しないでください。

なぜ呼び出されると思ったのかわかりません。無効な入力に対してビジネスロジックを実行するのはなぜですか?具体的な機能をより詳細に説明すると、このための適切なアプローチを提案できる可能性があります。


コメントに従って更新します。コンポーネントをビューにバインドすることで得られるdisabled結果を確認することにより、ビュー側で完全に他のコンポーネントの属性の入力コンポーネントの有効性を確認します。UIInput#isValid()

<h:inputText ... binding="#{input}">
    <f:ajax event="keyup" render="input2 input3 input4" />
    <f:validateRegex pattern="[0-9]{14}" />
</h:inputText>

<h:inputText id="input2" ... disabled="#{not input.valid}" />
<h:inputText id="input3" ... disabled="#{not input.valid}" />
<h:inputText id="input4" ... disabled="#{not input.valid}" />

ajaxリスナーメソッドは必要ありません。

于 2012-10-23T18:28:23.117 に答える