我有以下问题:我正在使用 a h:selectManyChecbox
inside 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 类型充当“内循环”,所以我们在这里有两个嵌套循环。这听起来对我在这个问题中提出的问题很熟悉,只是渲染目标导致了问题。
所以我的问题是:这是预期的行为吗?或者它是实现中的一些已知错误?我问是因为 selectManyListBox 和 selectManyMenu 工作得很好......无论如何我正在寻找一种解决这个问题的方法。还有其他人有类似的问题吗?
注意:不幸的是,c:foreach 不是选项,否则我会尝试;)摆弄执行参数没有效果(例如,execute=@form)。
编辑:这在使用p:ajax
Primefaces 时有效。无论如何,如果有其他有用的答案,我会保持开放一段时间。如果有人知道 p:ajax 的不同之处,这也很有趣。