[英]Primefaces autocomplete multiple with 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.