2011-11-28 20 views
7

Estoy usando el widget PrimeFaces p:autoComplete en un formulario de búsqueda de mi proyecto. El usuario puede elegir cuántos y qué elementos de formulario (parámetros de búsqueda) quiere incluir, así que necesito pasar un ID al completeMethod para cada uno de ellos. Intenté agregar onfocus=".." para pasar el objeto al bean, pero eso solo se activaría cuando se cargue el elemento primero.Pasando el parámetro para completar el método de p: autocompletar

Mi pregunta: ¿Cómo puedo pasar un atributo al completeMethod?

XHTML del elemento (simple):

<p:autoComplete value="#{filter.value}" label="dynamic search attribute" 
       completeMethod="#{myBean.complete}" /> 

El frijol (simple):

@Named("myBean") 
public class MyController implements Serializable { 

    public List<String> complete(String query) { 
     List<String> results = new ArrayList<String>(); 
     // ... code 
     return results; 
    } 
} 

En teoría, esto podría parecer la solución perfecta:

<p:autoComplete value="#{filter.value}" label="dynamic search attribute" 
       completeMethod="#{myBean.complete(filter)}" /> 

Y de nuevo el frijol:

@Named("myBean") 
public class MyController implements Serializable { 

    public List<String> complete(String query, FilterObject o) { 
     List<String> results = new ArrayList<String>(); 
     // ... database query based on FilterObject o 
     return results; 
    } 
} 

Respuesta

22

Se puede establecer como un atributo:

<p:autoComplete value="#{filter.value}" label="dynamic search attribute" completeMethod="#{myBean.complete}"> 
    <f:attribute name="filter" value="#{filter}" /> 
</p:autoComplete> 

y conseguirlo por UIComponent#getCurrentComponent():

public List<String> complete(String query) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    FilterObject o = (FilterObject) UIComponent.getCurrentComponent(context).getAttributes().get("filter"); 
    // ... 
} 

Alternativamente, como que #{filter} aparece en su caso al estar ya en el ámbito EL, se también puede dejar el <f:attribute> y obtenerlo mediante la evaluación de la expresión EL programáticamente con ayuda de Application#evaluateExpressionGet():

public List<String> complete(String query) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    FilterObject o = context.getApplication().evaluateExpressionGet(context, "#{filter}", FilterObject.class); 
    // ... 
} 

O, si también es un grano @Named, a continuación, puedes @Inject que en el grano de los padres:

@Inject 
private FilterObject o; 
+1

He intentado tanto sollutions sugeridas y ambos trabajado como un encanto. Elegí el segundo enfoque, así que no necesitaría el atributo. ¡Muchas gracias! –

+0

De nada. Tenga en cuenta que agregué una sugerencia '@ Inject' que también puede funcionar para usted. – BalusC

Cuestiones relacionadas