[英]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.