我使用的是JSF 2.2(Mojarra),PrimeFaces 4,Tomcat 7 我在ui中有两个相互依赖的自动完成字段:重复。当我在第一个自动完成中选择某些内容时,我需要设置第二个自动完成的值,反之亦然。
<ui:repeat var="anItem" value="#{aBean.itemList}" varStatus="status">
<p:inputText id="someId1" value="anItem.operation" required="true"/>
<p:autoComplete id="nature" dropdown="true" forceSelection="true" value="#{anItem.nature}" completeMethod="#{myController.completeNatureList}">
<p:ajax event="itemSelect" listener="#{myController.selectNature(status.index)}" process="@this" update="code"/>
</p:autoComplete>
<p:autoComplete id="code" dropdown="true" forceSelection="true" value="#{anItem.code}" completeMethod="#{myController.completeCodeList}">
<p:ajax event="itemSelect" listener="#{myController.selectCode(status.index)}" process="@this" update="nature"/>
</p:autoComplete>
</ui:repeat>
我的豆子
@ManagedBean(name = "aBean")
@ViewScoped
public class Bean implements Serializable {
List<Item> itemList;
// getter and setter
}
public class Item implements Serializable {
private String operation;
private String nature;
private String code;
// getter and setter
}
我的控制器看起来像这样:
@ManagedBean(name = "myController")
@ViewScoped
public class Controller implements Serializable {
@ManagedProperty(value = "#{aBean}")
private Bean aBean;
@Override
public void selectNature(final int pIndex) {
LOGGER.debug("Nature selected");
// business logic
this.aBean.getItemList().get(pIndex).setCode("code from business logic");
}
@Override
public void selectCode(final int pIndex) {
LOGGER.debug("Code selected");
// business logic
this.aBean.getItemList().get(pIndex).setNature("nature from business logic");
}
}
我第一次在第一次自动填充中选择某些内容时,它运行正常。但是,如果我在第二个自动填充中选择了某些内容,则我的第一个自动填充功能不会更新。如果我在第一个自动填充中重新选择了某些内容,则此功能不再适用。日志告诉我我的控制器总是被调用。
我尝试更新整个表单并且每次都有效,但我当然负担不起,因为我的表单中包含所有必填字段。
<p:ajax event="itemSelect" listener="#{myController.selectNature(status.index)}" process="@this" update="@form"/>
所以我的模型正确更新,问题似乎是渲染阶段已经处理过的字段的更新。
我不希望找到解决办法,因为我有很多类似的案例。我想理解为什么JSF表现得像这样,我做错了什么,知道为什么?
修改
看看这篇文章How to address a component inside a looping naming container,我尝试使用c:foreach而不是ui:repeat,它有效!
所以现在我想了解为什么我的旧解决方案使用ui:repeat只能使用一次。