簡體   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