2016-04-18 6 views
1

Я использую <p:autocomplete> теги и преобразователи символов, чтобы пользователь мог выбирать адреса из списка заданных адресов в системе. Ниже приведен пример кода .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; 
} 

Update на основе комментариев, 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

Так я предполагаю, что вы имели в виду '' List

в качестве возвращаемого типа вместо '' List и вместо 'addresses.add (0, новый адрес (запроса));' что-то вроде: 'Адрес tmpAddress = новый адрес (draft.getAddress()); // текущий адрес tmpAddress.setStreet (query); addresses.add (0, tmpAddress); ' Чтобы все остальные поля адреса сохраняли свои значения. – schrobe

+0

Мне никогда не приходило в голову, что список, который передается конвертеру, также может быть изменен динамически. Этот подход, похоже, работает, единственный недостаток, который я вижу, заключается в том, что пользователю не нужно использовать предложения автозаполнения и не иметь возможности просто вводить что-то в текстовые поля, которые затем могут быть использованы. Во всяком случае, спасибо большое !!! – schrobe

+0

А, Улица была просто опечаткой, я был отвлечен наполовину, написав ответ, а потом снова посмотрел на ваш вопрос. Он исправлен. Что касается недостатка, вы можете, например, спрятать элемент с помощью CSS. – BalusC

 Смежные вопросы

  • Нет связанных вопросов^_^