1

2 つの p:calendar コンポーネントから実装された jsf 複合コンポーネントがあります。アイデアは、最初のカレンダーが選択されたときに、2 番目のカレンダーの値をリセットする必要があるということです。検証時に問題が発生し、2 番目のカレンダーのリセットが実行されません。

投稿を読んだ後、バリデーターで EditableValueHolder を使用することにしました。私はカスタムバリデーターを持っています: 次のコードを追加しました:

@Override

public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException {
//....
resetValues(fc);
}

public void resetValues(FacesContext fc) {
    PartialViewContext partialViewContext = fc.getPartialViewContext();
    Collection<String> renderIds = partialViewContext.getRenderIds();
    UIComponent input;
    UIViewRoot viewRoot = fc.getViewRoot();
    for (String renderId : renderIds) {
        input = viewRoot.findComponent(renderId);
        if (input.isRendered() && input instanceof EditableValueHolder) {
            EditableValueHolder editableValueHolder = (EditableValueHolder) input;
            editableValueHolder.setSubmittedValue(null);
            editableValueHolder.setValue(null);
            editableValueHolder.setValid(true);
            editableValueHolder.setLocalValueSet(false);
        }
    }
}

デバッグ後、各コード行が渡されていることがわかりますが、jsf 側では何も起こっていません。

4

1 に答える 1

4

これは、値をリセットする適切なタイミングではありません。validate()いずれにせよ、メソッドが終了した後は現在のコンポーネントに対して、また検証されると 2 番目のカレンダーに対してもオーバーライドされます。アクション(リスナー)メソッドでモデル値を変更できるように、モデル値の更新フェーズの後、できればアクションの呼び出しフェーズの前にリセットを実行する必要があります。これには anActionListenerまたは aPhaseListenerを使用できます。

ところで、JSF ユーティリティ ライブラリOmniFacesには、このための再利用可能なソリューションがあり、ResetInputAjaxActionListener.

于 2012-07-12T02:35:46.907 に答える