将参数传递给p:autoComplete的completeMethod

时间:2011-11-28 11:35:42

标签: jsf-2 autocomplete primefaces

我在项目的搜索表单中使用PrimeFaces p:autoComplete小部件。用户可以选择他想要包含多少以及哪些表单元素(搜索参数),因此我需要为每个元素传递一个ID到completeMethod。我已经尝试添加onfocus=".."将对象传递给bean,但只有在首次加载元素时才会激活它。

我的问题:如何将属性传递给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;
    }
}

1 个答案:

答案 0 :(得分:29)

您可以将其设置为属性:

<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>并通过{{3 }}:

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

或者,如果它也是@Named bean,那么你可以只在父bean中Application#evaluateExpressionGet()

@Inject
private FilterObject o;