<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" />