将参数传递给p:autoComplete的completeMethod

Sim*_*ger 16 autocomplete primefaces jsf-2

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

我的问题:如何将属性传递给completeMethod

元素的XHTML(简单):

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

豆(简单):

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

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

从理论上讲,这似乎是完美的解决方案:

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

又来了豆子:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 33

您可以将其设置为属性:

<p:autoComplete value="#{filter.value}" label="dynamic search attribute" completeMethod="#{myBean.complete}">
    <f:attribute name="filter" value="#{filter}" />
</p:autoComplete>
Run Code Online (Sandbox Code Playgroud)

得到它UIComponent#getCurrentComponent():

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

或者,正如#{filter}您的情况中出现的那样,您已经在EL范围中,您也可以<f:attribute>通过以下方式以编程方式评估EL表达式来获取它Application#evaluateExpressionGet():

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

或者,如果它也是一个@Namedbean,那么你可以@Inject在父bean中使用它:

@Inject
private FilterObject o;
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了两种建议的解决方案,它们都非常有效。我选择了第二种方法,所以我不需要该属性。非常感谢! (2认同)