2011-11-28 21 views
7

Używam widgetu PrimeFaces p:autoComplete w formularzu wyszukiwania mojego projektu. Użytkownik może wybrać liczbę i jakie elementy formularza (parametry wyszukiwania), które chce uwzględnić, więc muszę przekazać identyfikator do każdego z nich: completeMethod. Próbowałem dodać onfocus="..", aby przekazać obiekt do komponentu bean, ale tylko wtedy był on aktywowany po załadowaniu pierwszego elementu.Przekazywanie parametru do ukończeniaMethod of p: autoComplete

Moje pytanie: Jak mogę przekazać atrybut do completeMethod?

XHTML elementu (prosty):

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

Fasola (prosty):

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

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

W teorii brzmi to idealne rozwiązanie:

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

I ponownie fasola:

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

Odpowiedz

22

Można ustawić go jako atrybut:

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

i dostać go UIComponent#getCurrentComponent():

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

Alternatywnie, jako że #{filter} pojawia się w Twoim przypadku będzie już w zakresie EL, ty można również zostawić <f:attribute> dalej i dostać go poprzez ocenę ekspresji EL programowo przy pomocy Application#evaluateExpressionGet():

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

Lub, jeśli jest to również @Named fasola, następnie można po prostu @Inject to w fasoli dominującej:

@Inject 
private FilterObject o; 
+1

Próbowałem zarówno sugerowane sollutions i oboje pracowali jak czar. Wybrałem drugie podejście, więc nie potrzebowałem tego atrybutu. Wielkie dzięki! –

+0

Nie ma za co. Zwróć uwagę, że dodałem sugestię '@ Inject', która może ci się również przydać. – BalusC

Powiązane problemy