<p: autoComplete completeMethod> не указывает параметр в выражении EL, как он работает?

В демо я вижу этот код. В этом JSF autoCompleteView.completeQuery вызывается без параметра, но этот метод определяется параметром String в компоненте. Это разрешено в JSF?

<p:autoComplete id="queryPojo" value="#{autoCompleteView.query}"
 completeMethod="#{autoCompleteView.completeQuery}" var="query"
 itemLabel="#{query.displayName}" itemValue="#{query}"
 converter="queryConverter" />

боб

public List<Query> completeQuery(String query) {

        List<Query> allQueries = service.getQueries();
        List<Query> filteredQueries = new ArrayList<Query>();

        for (int i = 0; i < allQueries.size(); i++) {
            Query skin = allQueries.get(i);
            if(skin.getName().toLowerCase().contains(query)) {
                filteredQueries.add(skin);
            }
        }         
        return filteredQueries;
    }

Отредактировано: поиск bean:

@Named
@RequestScoped
public class SearchController {

    private String word;

    // For AutoComplete suggestions
    private Query selectedQuery;

    @Inject
    private QueryService service;

    @Inject
    private Word wordObject;

    public void search() {
        if (word != null && !word.isEmpty()) {
            wordObject.searchWord(word);;
             ...
        }else {
            System.out.println("Query can't be null!");
        } 
    }

    public List<Query> completeQuery(String query) {

        List<Query> allQueries = service.getQueries();
        List<Query> filteredQueries = new ArrayList<Query>();

        for (int i = 0; i < allQueries.size(); i++) {
            Query skin = allQueries.get(i);
            if(skin.getName().toLowerCase().contains(query)) {
                filteredQueries.add(skin);
            }
        }

        return filteredQueries;
    }

    public String getWord() {
        return word;
    }

    public void setWord(String word) {
        this.word = word;
    }

   public Query getSelectedQuery() {

        return selectedQuery;
    }

    public void setSelectedQuery(Query selectedQuery) {
        this.selectedQuery = selectedQuery;
    }
}

JSF вид:

<h:form>
        <p:growl id="msgs" showDetail="true" />
        <h:panelGrid columns="2" cellpadding="5">

            <p:autoComplete id="wordForm" value="#{searchController.query}"
                completeMethod="#{searchController.completeQuery}" var="query"
                itemLabel="#{query.displayName}" itemValue="#{query}"
                converter="queryConverter" forceSelection="true" />

            <p:commandButton value="search" oncomplete="PF('dlg').show()" **action="#{searchController.search}"** />

        </h:panelGrid>
    </h:form>

Поскольку у меня есть форма p:AutoComplete, нужна ли мне эта обычная форма ввода текста?

                <h:inputText id="word" "
                    value="#{searchController.word}" />
                <h:message for="word" />
                <h:commandButton id="search" value="search"
                    action="#{searchController.search}" />
            </h:panelGrid>
        </h:form>

1 ответ

Да, это разрешено, потому что "completeMethod" автоматически устанавливает значение тега "value" в качестве параметра внутри "completeMethod". При таком подходе вы также можете задать собственный доменный объект внутри значения и работать с ним внутри вашего метода "completeMethod" вспомогательного компонента.

Редактировать:

<p:autoComplete id="wordForm" value="#{searchController.word}"
completeMethod="#{searchController.completeQuery}" var="query"
itemLabel="#{query.displayName}" itemValue="#{query}"
converter="queryConverter" forceSelection="true" />
Другие вопросы по тегам