2016-04-18 16 views
1

我正在使用<p:autocomplete>標記和omnifaces轉換器,以便讓用戶從系統中的給定地址列表中選擇地址。下面是兩個地址字段樣品.xhtml代碼:使用ListConverter與forceSelection = false

<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的好處?或者我必須從頭開始完全編寫我自己的轉換器?

回答

1

最簡單的方法就是將查詢添加到列表中。

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(); 
    } 

} 
+0

所以我假設你的意思'名單

'返回類型,而不是'名單'和替代 'addresses.add(0,新的地址(查詢));'是這樣的: '地址tmpAddress = new Address(draft.getAddress()); //當前地址 tmpAddress.setStreet(query); addresses.add(0,tmpAddress);' 爲了讓地址的所有其他字段保持其值。 – schrobe

+0

我從來沒有想到,賦予轉換器的列表也可以動態改變。 這種方法似乎可行,唯一的缺點是我看到的是用戶不得不使用自動填充建議並且不能在文本框中輸入可以使用的內容。無論如何,非常感謝! – schrobe

+0

啊,街道只是一個錯字,我半途分神地寫了答案,然後回頭看看你的問題。它已被修復。至於這個缺點,你可以例如可以選擇用CSS隱藏項目。 – BalusC

相關問題