为什么在选择项目后Primeface无法渲染自动完成组件?

问题描述 投票:0回答:1

在我的应用程序中,我将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<>();
}

开始时:enter image description here

添加新项目后:enter image description here

应为:enter image description here

jsf primefaces autocomplete
1个回答
0
投票

为什么要更新两次相同的输入?

您正在设置值,然后更新输入

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()); 
        }
      }
© www.soinside.com 2019 - 2024. All rights reserved.