java - PrimeFaces 自动完成功能在更新后失去值(value)

标签 java jsf primefaces autocomplete

我对 PrimeFaces 的自动完成组件有疑问。 我将它与 pojo 一起使用,所以我还创建了一个转换器,直到这里一切都很酷并且工作正常。

不过,在用户选择一个元素后,我调用一个支持 bean,其中 ajax 组件将所选对象作为参数发送。 在 ajax 组件中,我还设置了更新自动完成组件本身,当它使用所选 pojo 的 java 地址更新自动完成组件的字段值时,问题就来了。

例如:这是一个地址规范化服务,因此应该在用户开始输入内容时建议一个现有地址。 因此,用户开始在字段中输入类似 “john” 的内容,自动完成建议 “John Fitzgerald Kennedy, New York, New York” 以及其他建议。所以假设有大约 5 个建议。

建议是具有以下属性的地址类型的对象:地址、邮政编码、地区、州等。

到这里一切都很好。在建议中,用户只能看到建议的地址及其各自的区域。这就是我想要的。

现在用户单击其中一个建议,ajax 组件调用它必须调用的内容,执行它应该执行的操作,然后更新一些组件以及自动完成组件。直到更新之前一切正常,在现场我有我选择的项目的确切标签。但我进行更新是因为我需要现场的其他东西。

XHTML:

<p:autoComplete id="address"
            value="${normalizationBean.address}" var="result" converter="#{normalizationBean}"
            itemLabel="${''.getClass().toString().equalsIgnoreCase(result.getClass().toString()) ? result : result.indirizzo }"
            itemValue="${result}" completeMethod="#{normalizationBean.loadSuggestions}"
            disabled="#{disabled}" style="width:100%;" styleClass="input indi" immediate="true">
            <p:ajax update="cap, regionContainer" listener="#{normalizationBean.setSelectedSuggestion}" event="itemSelect">
                <ui:param name="selectedSuggestion" value="${result}" />
            </p:ajax>
            <p:column>
                ${result.indirizzo}
            </p:column>
            <p:column>
                ${result.localita}
            </p:column>
        </p:autoComplete>

转换器:

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if(value==null || value.equals(""))
        return null;
    try{
        return addressSuggestions.getList().get(Integer.valueOf(value));
    } catch(Exception e){
        return null;
    }
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if(value==null || value.equals(""))
        return null;

    return String.valueOf(addressSuggestions.getList().indexOf(value));
}

bean 类:

    @Model
        public class NormalizationBean implements Serializable, Converter{
        private AddressSuggestionsListType addressSuggestions;
        private String address;

        public List<AddressSuggestionsType> loadSuggestions(String query) {

        // call the service which returns a list of suggestions
                    AddressSuggestionsListType result = ShellService.instance()
                            .getSuggestions(query);

                    if (result == null){
                        addressSuggestions.setErr("Could not connect to service");
                    } else {
                        addressSuggestions= result;
                    }

                }

                return addressSuggestions.getList();
            }

        public void setSelectedSuggestion(SelectEvent selected){
                AddressSuggestionsType addType = (AddressSuggestionsType) selected.getObject();
                this.address = addType.getAddress();
            }

// ...
}

提前致谢! :)

最佳答案

将属性 immediate 从 true 更改为 false 就足够了。 显然它是从 itemValue 获取对象并返回它的 toString() 表示。

关于java - PrimeFaces 自动完成功能在更新后失去值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18074607/

相关文章:

java - Hibernate 一对多关系

jsf-2 - 处理 ViewExireException/ajax 并显示 Primefaces 对话框

jsf-2 - p :editor Primefaces 的剩余字符

css - 背景颜色 css 未申请 ace :textEntry

java - Apache Axis2 的 Eclipse 插件来创建 web 服务

java - 在 Itextpdf 中设置字体大小

java - 结果集中的基本编程 JTable 模型

java - java/kotlin 方程中的时间顺序和加法函数

jsf - 在 primefaces 自动完成事件中将值重置为 null

css - 带有 PrimeFaces 的 FontAwesome