1

フィールドのヘルプを使用してページを再表示する commandButton があります。これは JavaScript なしで機能する必要があります。検証をトリガーしたくないので、immediate = true を追加します。これはうまくいきますが、ページにあった検証メッセージは消えますが、そこにとどまることを望みます.

<h:commandButton rendered="#{cc.attrs.helpId!= null}" styleClass="helpButton" value="?" type="submit" action="#{visibleHelp.toggle(cc.clientId)}" immediate="true" />

...

<h:panelGroup rendered="#{visibleHelp[cc.clientId] != null}" id="#{cc.attrs.name}_helpText" styleClass="help-text">
    <h:outputText value="#{help[cc.attrs.helpId]}"/>
</h:panelGroup>

...

これはまさにその通りですか、それとも何か不足していますか?

4

1 に答える 1

0

それは予想される動作です。Faces メッセージはリクエスト スコープです。フォームを送信すると、新しいリクエストが作成されます。そのimmediate="true"属性を持たない入力コンポーネントは検証されないため、faces メッセージは生成されません。同期 (非 ajax) ポストバックでは、ページ全体がリロードされるため、最初のメッセージが「消えます」。

ページが完全にリロードされないように、代わりに ajax で送信してください。

<h:panelGroup id="helpButton">
    <h:commandButton rendered="#{cc.attrs.helpId!= null}" styleClass="helpButton" 
        value="?" action="#{visibleHelp.toggle(cc.clientId)}" immediate="true">
        <f:ajax render="helpButton helpSection" />
    </h:commandButton>
</h:panelGroup>

...

<h:panelGroup id="helpSection">
    <h:panelGroup rendered="#{visibleHelp[cc.clientId] != null}" 
        id="#{cc.attrs.name}_helpText" styleClass="help-text">
        <h:outputText value="#{help[cc.attrs.helpId]}"/>
   </h:panelGroup>
</h:panelGroup>

確かに、これにはまだ JavaScript が含まれていますが、他に実行可能な解決策がないかimmediate="true"、それらの入力コンポーネントの検証が再実行されるように削除する必要があります。

于 2013-02-06T13:57:39.470 に答える