2009-05-24 16 views
5

Podczas używania RichFaces suggestionBox w jaki sposób można przekazać więcej niż jeden identyfikator lub wartość ze strony z wprowadzonym tekstem do komponentu bean podkładu suggestionBox. tj: aby wyświetlić listę sugerowanych miast w wybranym państwie? Oto moja metoda autoComplete.Sugestie richfacesBox przekazujące dodatkowe wartości do komponentu bean fasoli

public List<Suburb> autocomplete(Object suggest) 
{ 
    String pref = (String) suggest; 
    ArrayList<Suburb> result = new ArrayList<Suburb>(); 

    Iterator<Suburb> iterator = getSuburbs().iterator(); 
    while(iterator.hasNext()) 
    { 
     Suburb elem = ((Suburb) iterator.next()); 
     if((elem.getName() != null && elem.getName().toLowerCase().indexOf(pref.toLowerCase()) == 0) || "".equals(pref)) 
     { 
      result.add(elem); 
     } 
    } 
    return result; 
} 

Jak widać istnieje jedna wartość przeszedł ze strony Object Suggest, która jest tekst h:inputText (w Facelets m:textFormRow)

<m:textFormRow id="suburb" label="#{msgs.suburbPrompt}" 
    property="#{bean[dto].addressDTO.suburb}" 
    required="true" maxlength="100" size="30" /> 

<rich:suggestionbox height="200" width="200" usingSuggestObjects="true" 
    suggestionAction="#{suburbsMBean.autocomplete}" var="suburb" for="suburb" 
    fetchValue="#{suburb.name}" id="suggestion"> 
    <h:column> 
     <h:outputText value="#{suburb.name}" /> 
    </h:column> 
</rich:suggestionbox> 

Wcześniej na stronie można wybrać stan, który chciałbym użyć, aby odświeżyć listę przedmieść wyświetlaną w polu sugestii.

+0

może być bardziej wyraźne, co staramy się robić - na przykład, zamieszczając prosty formularz z kontroli, które mają używać i wyliczać sekwencję zdarzeń, gdy użytkownik wprowadza dane. – McDowell

+0

Więc chcesz wybrać stan, to propozycja mogłaby sugerować tylko przedmieścia z tego stanu? Jak wygląda kod wyboru stanu? – Mark

Odpowiedz

0

Czy obejrzałeś ten pomysł RichFacesBox demo? Pod przykładami znajdują się linki do wyświetlenia źródła.

Edit:

Brzmi jak trzeba wartość stanu w swojej fasoli przed typów użytkowników w suggestionBox. Chciałbym użyć obsługi ajaxowej RichFaces, aby przekazać wartość stanu do komponentu bean, więc gdy metoda autouzupełniania jest wywoływana, ma stan wybrany przez użytkownika na stronie w celu zapełnienia listy przedmieść.

+0

Użyłem kodu z wersji demonstracyjnej richfaces. – Martlark

1

Czy używasz znacznika <f:parameter wewnątrz pracy <f:parameter?

+0

mimo że wskazało mi to we właściwym kierunku, to nie jest odpowiedź. Zawiera przydatne informacje, ale – PMorganCA

3

(Zastrzeżenie: Jestem świadomy, że pytano dość dawno temu, ale może to będzie pomóc komuś z podobnym problemem ...)

Sprawdź ten wpis na blogu, który zajmuje się czymś podobnym : RichFaces - SuggestionBox and hidden field.

Kluczem jest użycie <f:setPropertyActionListener value="#{...}" target="#{...}"> owiniętego wewnątrz <a4j:support event="onselect" ajaxSingle="true">. Można go użyć do ustawienia dodatkowej wartości dla komponentu bean, gdy zostanie wywołany onselect dla pola SuggestionBox.

Dzięki takiemu podejściu udało mi się stworzyć SuggestionBox który wyświetla (i Autouzupełnianie) klientów nazw ale po wybraniu ustawia cały obiekt klienta (z kilkoma właściwościami; identyfikowany przez ID) dla fasoli.

+0

Oto kolejna odpowiedź SO na temat zasadniczo tego samego problemu: http://stackoverflow.com/questions/1681559/richfaces-suggestionbox/1687031#1687031 – Jonik

0

Możesz użyć zakładki <f:parameter wewnątrz rich:suggestionbox. Moim zadaniem było filtrowanie listy według jakiegoś atrybutu elementu list, gdzie czasami ten atrybut mógł zostać zignorowany. Podobnie jak, czasami chcę listę tylko owoców cytrusowych, a czasami chcę całą listę dostępnych owoców.

Na stronie:

<rich:suggestionbox usingSuggestObjects="true" 
     suggestionAction="#{listBuilder.autocompleteFilterFruit('')}" var="ind" 
     for="fruitInput" fetchValue="#{fruit.name}" id="suggestion" > 
    <f:param name="constrainInd" value="#{basket.isConstrainedToCitrus}" /> 

    ... 

</rich:suggestionbox> 

miałem jedną klasę (Basket), który wiedział, czy lista musiała być specjalnym sączy i inną klasę (ListBuilder), który zbudowany listę.

W Basket:

public Boolean getIsConstrainedToCitrus() 
{ 
    return new Boolean (logic that answers "is this basket for citrus only"); 
} 

W ListBuilder:

public List<Fruit> autocompleteFilterFruit (Object arg) 
{ 
    List<Fruit> rtnList = new ArrayList<Fruit>(); 

    String suggestion = (String) arg; 

    // get the filter control that the page retrieved from the Basket 
    // 
    Map<String,String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); 
    boolean isConstrainedToCitrus = "true".equals (params.get ("constrainInd")); 

    // allFruit is a pre-initialized list of all the available fruit. use it to populate the return list according 
    // to the filter rules and matches to the auto-complete suggestions 
    for (Fruit item : allFruit) 
    { 
     if ((!isConstrainedToCitrus || item.isCitrus()) && item.name.startsWith(suggestion)) 
     { 
      rtnList.add (item); 
     } 
    } 
    return rtnList; 
} 
Powiązane problemy