J'utilise un selectOneMenu de primefaces éditable pour afficher certaines valeurs. Si l'utilisateur sélectionne un élément de la liste, une zone de texte doit être mise à jour. Toutefois, si l'utilisateur tape quelque chose dans le selectOneMenu, la zone de texte ne doit pas être mise à jour.
Je pensais que je pourrais travailler avec l'événement ajax. Cependant, je ne sais pas quel événement je peux utiliser ici. Je ne connais que l'événement valueChange
. Existe-t-il d'autres événements, comme onSelect
ou onKeyUp
?
Voici mon code:
<p:selectOneMenu id="betreff" style="width: 470px !important;"
editable="true" value="#{post.aktNachricht.subject}">
<p:ajax event="valueChange" update="msgtext"
listener="#{post.subjectSelectionChanged}" />
<f:selectItems value="#{post.subjectList}" />
</p:selectOneMenu>
<p:inputTextarea style="width:550px;" rows="15" id="msgtext"
value="#{post.aktNachricht.text}" />
Les événements ajax de PrimeFaces sont parfois très mal documentés. Dans la plupart des cas, vous devez donc aller dans le code source et vérifier vous-même.
p:selectOneMenu
_ prend en charge modification événement:
<p:selectOneMenu ..>
<p:ajax event="change" update="msgtext"
listener="#{post.subjectSelectionChanged}" />
<!--...-->
</p:selectOneMenu>
ce qui déclenche l'écouteur avec AjaxBehaviorEvent
comme argument dans la signature:
public void subjectSelectionChanged(final AjaxBehaviorEvent event) {...}
Veillez à ce que la page ne contienne aucun composant vide pour lequel l'attribut "obligatoire" est défini sur "true" avant que votre composant selectOneMenu ne soit en cours d'exécution.
Si vous utilisez un composant tel que
<p:inputText label="Nm:" id="id_name" value="#{ myHelper.name}" required="true"/>
puis,
<p:selectOneMenu .....></p:selectOneMenu>
et oubliez de remplir le composant requis, l'écouteur ajax de selectoneMenu ne peut pas être exécuté.
Vous pouvez vérifier si la valeur de votre composant selectOneMenu
appartient à la liste des sujets.
À savoir:
public void subjectSelectionChanged() {
// Cancel if subject is manually written
if (!subjectList.contains(aktNachricht.subject)) { return; }
// Write your code here in case the user selected (or wrote) an item of the list
// ....
}
Soi-disant subjectList
est un type de collection, comme ArrayList
. Bien sûr, votre code s’exécutera au cas où l’utilisateur écrit un élément de votre liste selectOneMenu
.
Je préférerais utiliser un événement plus pratique itemSelect
. Avec cet événement, vous pouvez utiliser org.primefaces.event.SelectEvent
objets dans votre auditeur.
<p:selectOneMenu ...>
<p:ajax event="itemSelect"
update="messages"
listener="#{beanMB.onItemSelectedListener}"/>
</p:selectOneMenu>
Avec un tel auditeur:
public void onItemSelectedListener(SelectEvent event){
MyItem selectedItem = (MyItem) event.getObject();
//do something with selected value
}