Передача параметра в completeMethod для p: autoComplete - PullRequest
14 голосов
/ 28 ноября 2011

Я использую виджет PrimeFaces p:autoComplete в поисковой форме моего проекта.Пользователь может выбрать, сколько и какие элементы формы (параметры поиска) он хочет включить, поэтому мне нужно передать идентификатор в completeMethod для каждого из них.Я попытался добавить onfocus="..", чтобы передать объект в bean-компонент, но он активируется только при первой загрузке элемента.

Мой вопрос: как я могу передать атрибут в completeMethod?

XHTML элемента (простой):

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

1 Ответ

30 голосов
/ 28 ноября 2011

Вы можете установить его в качестве атрибута:

<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> и получить его, программно оценив выражение EL с помощью 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;
...