Jsf 2 将参数传递给p:autoComplete的completeMethod
我正在项目的搜索表单中使用PrimeFacesJsf 2 将参数传递给p:autoComplete的completeMethod,jsf-2,autocomplete,primefaces,Jsf 2,Autocomplete,Primefaces,我正在项目的搜索表单中使用PrimeFacesp:autoComplete小部件。用户可以选择要包含多少以及哪些表单元素(搜索参数),因此我需要为每个元素向completeMethod传递一个ID。我尝试添加onfocus=“…”以将对象传递给bean,但只有在第一次加载元素时才会激活 我的问题:如何将属性传递给completeMethod 元素的XHTML(简单): bean(简单): @Named(“myBean”) 公共类MyController实现可序列化{ 公共列表完成(字符串查询
p:autoComplete
小部件。用户可以选择要包含多少以及哪些表单元素(搜索参数),因此我需要为每个元素向completeMethod
传递一个ID。我尝试添加onfocus=“…”
以将对象传递给bean,但只有在第一次加载元素时才会激活
我的问题:如何将属性传递给completeMethod
元素的XHTML(简单):
bean(简单):
@Named(“myBean”)
公共类MyController实现可序列化{
公共列表完成(字符串查询){
列表结果=新建ArrayList();
//…代码
返回结果;
}
}
理论上,这似乎是一个完美的解决方案:
<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;
}
}
@Named(“myBean”)
公共类MyController实现可序列化{
公共列表完成(字符串查询、筛选器对象o){
列表结果=新建ArrayList();
//…基于FilterObject o的数据库查询
返回结果;
}
}
您可以将其设置为属性:
<p:autoComplete value="#{filter.value}" label="dynamic search attribute" completeMethod="#{myBean.complete}">
<f:attribute name="filter" value="#{filter}" />
</p:autoComplete>
或者,由于您的案例中出现的{filter}
已经在EL范围内,您也可以将
放在一边,通过以下帮助以编程方式计算EL表达式来获得它:
我尝试了两种建议的解决方案,它们都很有效。我选择了第二种方法,因此不需要属性。谢谢!不客气。请注意,我添加了一个
@Inject
建议,这可能也适用于您。
@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;
}
}
<p:autoComplete value="#{filter.value}" label="dynamic search attribute" completeMethod="#{myBean.complete}">
<f:attribute name="filter" value="#{filter}" />
</p:autoComplete>
public List<String> complete(String query) {
FacesContext context = FacesContext.getCurrentInstance();
FilterObject o = (FilterObject) UIComponent.getCurrentComponent(context).getAttributes().get("filter");
// ...
}
public List<String> complete(String query) {
FacesContext context = FacesContext.getCurrentInstance();
FilterObject o = context.getApplication().evaluateExpressionGet(context, "#{filter}", FilterObject.class);
// ...
}
@Inject
private FilterObject o;