我遇到以下问题:我在h:selectManyChecbox
内使用ui:repeat
。值更改侦听器附加到组件,以及f:ajax
。我希望在每次选择/取消选择时触发事件,然后操作辅助bean中的某些值并相应地更新视图。我将其缩小为以下示例:
<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类型充当“内部循环”,所以我们在这里有两个嵌套循环。这听起来与我在this question中提出的问题非常熟悉,只是在那里导致问题的渲染目标。
所以我的问题是:这是预期的行为吗?或者它是实现中的一些已知错误?我问,因为selectManyListBox和selectManyMenu工作得很好...... 无论如何,我正在寻找解决这个问题的方法。还有其他人有类似的问题吗?
注意:不幸的是,c:foreach是没有选项,否则我已经尝试过了;)摆弄execute参数没有效果(例如execute = @ form)。
编辑:当使用Primefaces中的p:ajax
时,此功能正常。如果有其他有用的答案,我会暂时保持开放状态一段时间。如果有人知道p:ajax的不同之处,那么知道这一点也很有趣。