2009-05-24 8 views
5

Al usar los RichFaces suggestionBox cómo puede pasar más de un id o valor de la página con el ingreso de texto al suggestionBox bean de respaldo. es decir: ¿mostrar una lista de ciudades sugeridas dentro de un estado seleccionado? Aquí está mi método autoComplete.richfaces suggestionBox pasando valores adicionales al bean de respaldo

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

Como se puede ver hay un valor que se pasa de la página, Object sugieren, que es el texto de la h:inputText (en los 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> 

Al principio de la página se puede seleccionar un estado que me gustaría usar para reducir la lista de suburbios que muestra el buzón de sugerencias.

+0

Puede que tenga que ser más explícito acerca de lo que está tratando de hacer - por ejemplo, la publicación de un sencillo formulario con los controles que desee para usar y deletrear la secuencia de eventos a medida que el usuario ingresa datos. – McDowell

+0

Entonces, ¿desea seleccionar el estado, entonces el sugetionbox solo sugeriría suburbios de ese estado? ¿Cómo se ve el código para seleccionar el estado? – Mark

Respuesta

0

¿Has visto este RichFaces suggestionBox demo todavía? Hay enlaces debajo de los ejemplos para ver la fuente.

Editar:

Suena como que necesita el valor de estado en su frijol antes de que el usuario escribe en el suggestionBox. Yo usaría el soporte RichFaces ajax para pasar el valor de estado al bean así que cuando se llama al método de autocompletar tiene el estado que el usuario seleccionó en la página para llenar una lista de suburbios.

+0

He usado el código de la demostración richfaces. – Martlark

1

¿Usa la etiqueta <f:parameter dentro del trabajo <rich:suggestionbox?

+0

aunque esto me apuntó en la dirección correcta, no es una respuesta. Contiene información útil, aunque – PMorganCA

3

(Negación: No soy consciente de que la pregunta fue hecha hace bastante tiempo, pero tal vez esto ayude a alguien con un problema similar ...)

Salida esta entrada del blog que trata de algo similar : RichFaces - SuggestionBox and hidden field.

La clave es usar <f:setPropertyActionListener value="#{...}" target="#{...}"> envuelto dentro de <a4j:support event="onselect" ajaxSingle="true">. Esto se puede usar para establecer un valor adicional para un bean de respaldo cuando se activa onselect para SuggestionBox.

Con este enfoque que lograron crear un SuggestionBox que muestra (y completa automáticamente a los clientes) nombres sino sobre todo la selección establece un objeto cliente (con varias propiedades; identificado por un identificador) para un bean.

+0

Aquí hay otra respuesta SO sobre básicamente el mismo problema: http://stackoverflow.com/questions/1681559/richfaces-suggestionbox/1687031#1687031 – Jonik

0

Puede usar la pestaña <f:parameter dentro del rich:suggestionbox. Mi tarea era filtrar una lista de acuerdo con algún atributo del elemento de la lista, donde a veces ese atributo podía ignorarse. Al igual que, a veces quiero una lista de solo cítricos, y a veces quiero la lista completa de fruta disponible.

En la página:

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

tuve una clase (Basket) que sabía si la lista tenía que ser especial, se filtró, y otra clase (ListBuilder) que construyó la lista.

En Basket:

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

En 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; 
} 
Cuestiones relacionadas