上下文是添加或修改数据库表条目的表单。 在其中,我想创建一个搜索/选择子表单:
到目前为止,我实现了只有在修改现有条目(通过URL传递id)时才能使搜索文本输入有效。如果我在创建一个新的时候它不起作用。
第二个问题是(在修改条目的情况下,已经有效),当在selectOneMenu中选择了一个值时,似乎没有调用监听器。但是对于具有硬编码值的selectOneMenu,它可以正常工作。有关其他信息,请参阅编辑。
这是子表单代码:
<h:form>
<h2>#{msg['addPeopleToFilm']}</h2>
<div class="inputWrapper">
<h:inputText id="search" value="#{beanPersonne.recherche}" >
<f:ajax listener="#{beanPersonne.searchStringChanged}" render="output" event="change" />
</h:inputText>
<label>#{msg['personSearch']}</label>
</div>
<div class="selectWrapper" >
<h:selectOneMenu value="#{beanFilm.idToAdd}" id="output" >
<f:selectItems
value = "#{beanPersonne.resultatsRechercheDynamique}"
var="personne"
itemValue="#{personne.idPersonne}"
itemLabel="#{personne.prenom} #{personne.nom}" />
<f:ajax listener="#{beanFilm.idToAddChanged}" render="idToAdd" event="change" />
</h:selectOneMenu>
</div>
<div class="selectWrapper" >
<h:selectOneMenu value="#{beanFilm.categoryChoice}" id="category">
<f:selectItem itemLabel="#{msg['actor']} ›" itemValue="0" />
<f:selectItem itemLabel="#{msg['producer']} ›" itemValue="1" />
<f:selectItem itemLabel="#{msg['director']} ›" itemValue="2" />
<f:ajax listener="#{beanFilm.categoryChoiceChanged}" render="categoryChoice" event="change" />
</h:selectOneMenu>
</div>
<h:commandButton value="Test">
</h:commandButton>
<h2><h:outputText id="idToAdd" value="#{beanFilm.idToAdd}" /></h2>
<h2><h:outputText id="categoryChoice" value="#{beanFilm.categoryChoice}" /></h2>
</h:form>
这是我的bean beanFilm的大部分内容(在beanPersonne中几乎相同):
公共类BeanFilm实现Serializable {
private static final long serialVersionUID = 807253156212218187L;
private Film film = new Film();
private String recherche = new String();
private String idToAdd = new String();
private String categoryChoice = new String();
private List<Film> resultatsRechercheDynamique = new ArrayList<Film>();
public List<Film> getResultatsRechercheFilmPro() {
return DAOFilmJPA.getInstance().getFilmsParTitre(recherche);
}
public String searchByTitle(String title)
{
recherche = title;
this.resultatsRechercheDynamique = getResultatsRechercheFilmPro();
return null;
}
public void searchStringChanged(AjaxBehaviorEvent abe)
{
searchByTitle(recherche);
}
public void idToAddChanged(AjaxBehaviorEvent abe)
{
// HERE GOES FUTURE CODE
}
public void categoryChoiceChanged(AjaxBehaviorEvent abe)
{
// HERE GOES FUTURE CODE
}
public List<Film> getResultatsRechercheDynamique() {
return resultatsRechercheDynamique;
}
public void setResultatsRechercheDynamique(
List<Film> resultatsRechercheDynamique) {
this.resultatsRechercheDynamique = resultatsRechercheDynamique;
}
public Film getFilm() {
return film;
}
public void setFilm(Film film) {
this.film = film;
}
public int getIdFilm() {
return film.getIdFilm();
}
public void setIdFilm(int id) {
film = DAOFilmJPA.getInstance().get(id);
}
public String getRecherche() {
return recherche;
}
public void setRecherche(String recherche) {
this.recherche = recherche;
}
public String doRecherche() {
return "toResultatsRecherche";
}
public String getIdToAdd() {
return idToAdd;
}
public void setIdToAdd(String idToAdd) {
this.idToAdd = idToAdd;
}
public String getCategoryChoice() {
return categoryChoice;
}
public void setCategoryChoice(String categoryChoice) {
this.categoryChoice = categoryChoice;
}
}
编辑:如果我在第一个selectOneMenu中添加一个具有固定值的selectItem,在selectItem s 旁边,它会触发侦听器就好了,但仅限于此条目,而不是selectItem s 生成的那些。 使用调试模式,我发现选择selectItem s 生成的值不会调用链接侦听器,而使用selectItem时会调用它。