2011-11-28 20 views
7

मैं प्राइमफेस p:autoComplete विजेट का उपयोग अपने प्रोजेक्ट के एक खोज फ़ॉर्म में कर रहा हूं। उपयोगकर्ता यह चुन सकता है कि वह कितने और किस फॉर्म-तत्व (खोज पैरामीटर) को शामिल करना चाहता है, इसलिए मुझे उनमें से प्रत्येक के लिए completeMethod पर एक आईडी पास करने की आवश्यकता है। मैंने ऑब्जेक्ट को बीन पर पास करने के लिए onfocus=".." जोड़ने का प्रयास किया है, लेकिन जब तत्व पहले लोड होता है तो केवल सक्रिय हो जाएगा।पूर्ण करने के लिए पैरामीटर पास करना पी: ऑटोकंपलेट

मेरा प्रश्न: मैं completeMethod पर एक विशेषता कैसे पास कर सकता हूं?

तत्व की एक्सएचटीएमएल (सरल):

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

सेम (सरल):

@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} अपने मामले में प्रकट होता है ईएल दायरे में पहले से ही हो सकता है, आप <f:attribute> दूर भी छोड़ सकते हैं और इसे Application#evaluateExpressionGet():

public List<String> complete(String query) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    FilterObject o = context.getApplication().evaluateExpressionGet(context, "#{filter}", FilterObject.class); 
    // ... 
} 
की सहायता से प्रोग्रामिंग रूप से ईएल अभिव्यक्ति का मूल्यांकन करके प्राप्त कर सकते हैं

या, यदि यह भी एक @Named सेम है, तो आप सिर्फ @Inject यह माता पिता की फलियों में कर सकते हैं:

@Inject 
private FilterObject o; 
+1

मैं दोनों का सुझाव दिया sollutions की कोशिश की और वे दोनों एक आकर्षण की तरह काम किया। मैंने दूसरा दृष्टिकोण चुना है इसलिए मुझे विशेषता की आवश्यकता नहीं होगी। आपका बहुत बहुत धन्यवाद! –

+0

आपका स्वागत है। ध्यान दें कि मैंने एक '@ इंजेक्ट' सुझाव जोड़ा है जो आपके लिए भी काम कर सकता है। – BalusC

संबंधित मुद्दे