繁体   English   中英

将 ListConverter 与 forceSelection=false 一起使用

[英]Using ListConverter with forceSelection=false

我正在使用<p:autocomplete>标签和 omnifaces 转换器,以便让用户从系统中给定地址的列表中选择地址。 下面是两个地址字段的示例 .xhtml 代码:

   <p:autoComplete id="name" completeMethod="#{viewBean.autocompleteName}" var="_address"
        value="#{viewBean.draft.address}" itemValue="#{_address}"
        itemLabel="#{_address.name}">
        <o:converter converterId="omnifaces.ListConverter" list="#{viewBean.addresses}" />
         <p:column>
            <h:outputText value="#{_address.name}" />
        </p:column>
        <p:column>
            <h:outputText value="#{_address.street}" />
        </p:column>
        <p:ajax event="itemSelect" listener="#{viewBean.onAddressSelected}" update="addressPanel" />
    </p:autoComplete>

    <p:autoComplete id="street" completeMethod="#{viewBean.autocompleteStreet}" var="_address"
        value="#{viewBean.draft.address}" itemValue="#{_address}"
        itemLabel="#{_address.street}">
        <o:converter converterId="omnifaces.ListConverter" list="#{viewBean.addresses}" />
        <p:column>
            <h:outputText value="#{_address.name}" />
        </p:column>
        <p:column>
            <h:outputText value="#{_address.street}" />
        </p:column>
        <p:ajax event="itemSelect" listener="#{viewBean.onAddressSelected}" update="addressPanel" />
    </p:autoComplete>

选择后,其他字段(用于其他地址属性)将自动填充。 到目前为止,这工作正常。

问题来了:我想允许与选项列表中的任何现有项目不同的输入( forceSelection="false" )。 假设用户选择了一个现有地址,但随后更改了街道名称并保存了它。

目前,使用 ListConverter,此更改将被简单地忽略并且对象保持不变。

我想要的行为是修改并保存业务对象( viewBean.draft.address )。 换句话说,新对象不再是我提供给转换器的选项列表的成员。

有没有办法实现这种行为,但仍然使用omnifaces.ListConverter的好处? 还是我必须完全从头开始编写自己的转换器?

最简单的方法是将查询添加到列表中。

public List<Address> autocompleteStreet(String query) {
   addresses = addressService.listByStreet(query);
   addresses.add(0, new Address(query)); // <-- Just add query to list.
   return addresses;
}

根据评论更新,PF 在处理forceSelection="false"和转换的项目值时似乎有问题。 最好的办法是按如下方式扩展 OmniFaces ListConverter ,然后改用它。

@FacesConverter("addressListConverter")
public class AddressListConverter extends ListConverter {

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

        return ((Address) value).getStreet();
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM