在我的应用程序中,我将Primeface 6.2与JavaEE 7一起使用我在页面上添加了具有下拉功能的AutoComplete组件。我用数据库中的数据填充下拉列表。当我从下拉列表中选择一个新项目时,应将此项目(是字符串)附加到AutoComplete组件的输入字段中。如果我手动刷新浏览器,它将正确显示。
有人知道为什么以及如何解决它吗?
视图中:
<p:autoComplete id="ck" dropdown="false" scrollHeight="200" emptyMessage="geen resultaat" rendered="true"
value="#{onBean.ckString}"
binding="#{onBean.autoComplete}"
completeMethod="#{onBean.completeText}" >
<p:ajax event="itemSelect" listener="#{onBean.handleSelect}" update="mainForm:ck" />
</p:autoComplete>
在bean中:
public void handleSelect(SelectEvent event) {
String selected = String.valueOf(event.getObject());
String selection = this.ckString == null ? selected : this.ckString.concat(",").concat(selected);
UIInput input = (UIInput) event.getComponent();
input.resetValue();
input.setValue(selection);
PrimeFaces.current().ajax().update(input.getClientId());
FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(input.getClientId());
}
public List<String> completeText(String query) {
String searchQuery = query.substring(query.contains(",") ? query.lastIndexOf(",") + 1 : 0);
return ckList != null ? ckList.stream().filter(ck -> ck.startsWith(searchQuery)).collect(Collectors.toList()) : new ArrayList<>();
}
为什么要更新两次相同的输入?
您正在设置值,然后更新输入
PrimeFaces.current().ajax().update(input.getClientId());
在此方法之后,您将再次在xhtml中对其进行更新
<p:ajax event="itemSelect" listener="#{onBean.handleSelect}" update="mainForm:ck"/>
,但您的值是
value="#{onBean.ckString}"
尝试通过bean中的新值设置this.ckString。此方法应该足够了:
public void handleSelect(SelectEvent event) {
if (this.ckString != null) {
this.ckString = this.ckString + String.valueOf(event.getObject());
}
}