0

これは、SO に関する私の最初の投稿です。

Richfaces4 で JSF2 を使用していますが、次の問題があります。

ドロップダウン メニューの値に応じて、パネルの一部の入力フィールドを無効にして必須にしないでください。それ以外の場合は、それらのフィールドを有効にして必須にする必要があります。

私のxhtmlには次のものがあります

<h:selectOneMenu value="#{backingBean.field}" id="ResponseType">
    <f:selectItems value="#{backingBean.responseTypes}" />
    <f:ajax event="change" execute="@this" render="myPanel" listener="#{backingBean.responseTypeValueChange}" immediate="true"></f:ajax>
</h:selectOneMenu>
<rich:panel id="myPanel">
    <h:inputText id="input1" label="label1" value="#{backingBean.input1}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
    <h:inputText id="input2" label="label2" value="#{backingBean.input2}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
    <h:inputText id="input3" label="label3" value="#{backingBean.input3}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
    <h:inputText id="input4" label="label4" value="#{backingBean.input4}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
</rich:panel>

私のバッキング Bean は Spring Bean で、コードは次のとおりです。

public class BackingBean {
    private boolean flagDisabled;
    private String field;

    // getters and setters

    public List<SelectItem> getResponseTypes() {
        ...
        // returns values [1: Positive], [2: Negative]
    }

    public void responseTypeValueChange(AjaxBehaviorEvent event) {
        flagDisabled = "2".equals(field);
    }
}

私の問題は、responseTypeValueChange メソッドが呼び出されると、フィールド変数が前のリクエストの値を保持することです。だから私はいつも正反対の行動をとります。

a4j:ajax でも試しましたが、同じ結果が得られます。

次に、次のようにイベント引数から submitValue を取得するようにメソッドを変更しました。

public void responseTypeValueChange(AjaxBehaviorEvent event) {
    if (event.getSource() instanceof HtmlSelectOneMenu) {
        HtmlSelectOneMenu source = (HtmlSelectOneMenu) event.getSource();
        flagDisabled = "2".equals(source.getSubmittedValue());
    }
}

上記は機能しますが、flagDisabled 値を更新してからメソッドを呼び出すにはどうすればよいですか? 私の解決策は最善ではないと感じています。それは実際にはハックです。

ありがとうございました。

4

1 に答える 1

1

長い時間をかけて、JSF 検証に関する別の問題を調査しているときに、次のようなものを使用せずにメソッドを適切に呼び出す方法を見つけました。

if (event.getSource() instanceof HtmlSelectOneMenu) {
    HtmlSelectOneMenu source = (HtmlSelectOneMenu) event.getSource();
    flagDisabled = "2".equals(source.getSubmittedValue());
}

この要素のみを ajax リクエストに含めるために<h:selectOneMenu>、属性を追加しました。execute="@this"

奇妙なことに、ここの例ではそれがありましたが、実際のコードではありませんでした。 誤解を招く投稿で申し訳ありません。

ところで: これはマネージド Bean のスコープとは関係ありません。Bean はセッション スコープですが、Spring のカスタム ビュー スコープを作成し、JSF@ViewScopeを使用しても結果はありませんでした。

于 2013-10-21T15:23:41.330 に答える