web-dev-qa-db-fra.com

selectOneMenu événements ajax

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}" />
29
leostiw

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)  {...}
61
Danubian Sailor

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é.

3
ÖMER TAŞCI

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.

2
Stefanos Kargas

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
}
2
Michał Stochmal