次の問題があります。 a のh:selectManyChecbox
中で aを使用していui:repeat
ます。コンポーネントには、値変更リスナーとf:ajax
. 選択/選択解除のたびにイベントをトリガーしてから、バッキング Bean でいくつかの値を操作し、それに応じてビューを更新します。次の例に減らしました。
JSFページ
<ui:repeat id="loop" value="#{testAction.stringListe}" var="string">
<h2>#{string}</h2>
<h:inputText id="input" value="#{testAction.testInt}" />
<h:selectBooleanCheckbox value="#{testAction.testBoolean}"
id="checkbox"
valueChangeListener="#{testAction.valueChangeListener}">
<f:ajax render="input" />
</h:selectBooleanCheckbox>
<h:outputLabel for="checkbox" value="Change Me!"/>
<h:selectManyCheckbox id="options"
value="#{testAction.selections}"
layout="pageDirection"
valueChangeListener="#{testAction.valueChangeListener}">
<f:ajax render="input" />
<f:selectItem itemValue="changeMe" itemLabel="Change me!" />
<f:selectItem itemValue="changeToo" itemLabel="Me too!" />
</h:selectManyCheckbox>
</ui:repeat>
バッキングビーン
public class TestAction {
private boolean testBoolean;
private int testInt;
List<String> stringListe = new ArrayList<String>();
List<String> selections = new ArrayList<String>("Number 1", "Number 2");
// Getter + Setter accordingly
public void valueChangeListener(ValueChangeEvent event) {
testInt = (int) (Math.random() * 100);
System.out.println(testInt);
}
このセットアップでは、次のエラーが発生します。
<f:ajax> contains an unknown id 'form:loop:0:options' - cannot locate it in the context of the component options
ここでは、レンダー ターゲットは問題ではないようです。代わりに、ajax の実行の暗黙的な @this が失敗するようです。つまり、コンポーネントは自分自身を見つけることができません。奇妙なことに、これは selectManyCheckbox にのみ適用されます。単一のチェックボックスで問題ありません。これは、selectMany の種類が「内部ループ」として機能するためであると想定しているため、ここには 2 つのネストされたループがあります。これは、私がこの質問で尋ねたことに奇妙になじみがあるように聞こえますが、レンダー ターゲットが問題を引き起こしているだけです。
だから私の質問は次のとおりです:これは予想される動作ですか? それとも、実装の既知のバグですか? selectManyListBox と selectManyMenu が正常に機能するため、質問しています...いずれにせよ、これを回避する方法を探しています。他の誰かに同様の問題がありますか?
注:残念ながら、c:foreach はオプションではありません。そうでなければ試してみたでしょう ;) execute パラメータをいじっても効果はありませんでした (execute=@form など)。
編集:これp:ajax
はPrimefacesから使用するときに機能します。他に役立つ回答がある場合に備えて、とにかくしばらくの間これを開いたままにします。p:ajax の違いを誰かが知っているなら、これも興味深いでしょう。