2011-11-28 76 views
7

我在我的項目的搜索表單中使用PrimeFaces p:autoComplete小部件。用戶可以選擇他想包含多少個和哪些表單元素(搜索參數),所以我需要將ID傳遞給每個人的completeMethod。我已經嘗試添加onfocus=".."將對象傳遞給bean,但只有當元素第一次被加載時纔會被激活。傳遞參數以完成p的方法:自動完成

我的問題:如何將屬性傳遞給completeMethod

XHTML元素(簡單):

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

這個bean(簡單):

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

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

理論上,這似乎像是一個完美的解決方案:

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

而且豆再次:

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

回答

22

你可以將其設置爲一個屬性:

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

UIComponent#getCurrentComponent()得到它:

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

另外,作爲#{filter}出現在你的情況是已經在EL的範圍,你也可以離開<f:attribute>,並通過以Application#evaluateExpressionGet()的幫助以編程方式評估EL表達來獲得它:

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

或者,如果它也是一個@Named豆,那麼你可以@Inject它的父bean:

@Inject 
private FilterObject o; 
+1

我都嘗試建議sollutions,他們都工作就像一個魅力。我選擇了第二種方法,所以我不需要這個屬性。非常感謝! –

+0

不客氣。請注意,我添加了一個'@ Inject'建議,可能也適合您。 – BalusC