2011-11-28 54 views
7

Projemin bir arama şeklinde PrimeFaces p:autoComplete widget'ı kullanıyorum. Kullanıcı, kaç tane ve hangi form öğelerini (arama parametrelerini) içerdiğini seçebilir, böylece her biri için completeMethod'a bir kimlik iletmem gerekir. Nesneyi fasülyeye geçirmek için onfocus=".." eklemeyi denedim, ancak yalnızca öğe ilk yüklendiğinde etkinleştirilecek.: Otomatik Tamamlama

Sorum: Nasıl completeMethod için bir öznitelik geçebilir? (Basit) elemanın

XHTML: (basit)

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

fasulye: Teoride

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

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

bu mükemmel bir çözüm gibi görünüyor:

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

Ve yine bakla:

Eğer

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

Alternatif o #{filter} EL kapsamında zaten olması sizin durumunuzda göründüğü gibi:

cevap

22

Bir özelliği olarak ayarlayabilirsiniz:

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

ve UIComponent#getCurrentComponent() tarafından olsun Ayrıca <f:attribute>'u bırakabilir ve EL ifadesini programsal olarak Application#evaluateExpressionGet():

public List<String> complete(String query) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    FilterObject o = context.getApplication().evaluateExpressionGet(context, "#{filter}", FilterObject.class); 
    // ... 
} 
yardımıyla değerlendirerek alabilirsiniz

Ya da, aynı zamanda bir @Named fasulye ise o zaman sadece @Inject o ana fasulye olabilir:

@Inject 
private FilterObject o; 
+1

ben hem önerdi sollutions denedik ve her ikisi de mükemmel çalıştı. İkinci yaklaşımı seçtim, bu yüzden özniteliğe ihtiyacım yoktu. Çok teşekkürler! –

+0

Rica ederim. Sizin için de çalışabilecek bir '@ Inject' öneri eklediğimi unutmayın. – BalusC