<p:autoComplete Method> 没有在 EL 表达式中指定参数,它是如何工作的?



在演示中,我看到了这段代码。在此 JSF 中,调用 autoCompleteView.completeQuery 时不带参数,但此方法是使用 Bean 中的字符串参数定义的。这在 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:自动完成表单,我还需要这个普通的输入文本表单吗?

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

是的,这是允许的,因为"completeMethod"会自动将"value"标签的值设置为"completeMethod"中的参数。使用这种方法,您还可以在值中给出自己的域对象,并在支持Bean "completeMethod"方法中使用它。

编辑:

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

最新更新