it-swarm.com.de

selectOneMenu Ajax-Ereignisse

Ich verwende ein editierbares primefaces selectOneMenu, um einige Werte anzuzeigen. Wenn der Benutzer ein Element aus der Liste auswählt, sollte ein Textbereich aktualisiert werden. Wenn der Benutzer jedoch etwas in das selectOneMenu eingibt, sollte das Textfeld nicht aktualisiert werden.

Ich dachte, ich könnte das mit einem Ajax-Event klären. Ich weiß jedoch nicht, welches Ereignis ich hier verwenden kann. Ich kenne nur das Ereignis valueChange. Gibt es noch andere Ereignisse wie onSelect oder onKeyUp?

Hier ist mein 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

Die PrimeFaces-Ajax-Ereignisse sind manchmal sehr schlecht dokumentiert, sodass Sie in den meisten Fällen zum Quellcode gehen und sich selbst überprüfen müssen.

p:selectOneMenu unterstützt change event:

<p:selectOneMenu ..>
    <p:ajax event="change" update="msgtext"
        listener="#{post.subjectSelectionChanged}" />
    <!--...-->
</p:selectOneMenu>

was den Listener mit AjaxBehaviorEvent als Argument in der Signatur auslöst:

public void subjectSelectionChanged(final AjaxBehaviorEvent event)  {...}
61
Danubian Sailor

Achten Sie darauf, dass die Seite keine leere Komponente enthält, deren Attribut "required" den Wert "true" hat, bevor Ihre selectOneMenu-Komponente ausgeführt wird.
Wenn Sie eine Komponente wie

<p:inputText label="Nm:" id="id_name" value="#{ myHelper.name}" required="true"/>

dann,

<p:selectOneMenu .....></p:selectOneMenu>

und vergessen Sie, die erforderliche Komponente zu füllen, ein Ajax-Listener von selectoneMenu kann nicht ausgeführt werden.

3
ÖMER TAŞCI

Sie können überprüfen, ob der Wert Ihrer selectOneMenu Komponente zur Themenliste gehört.

Nämlich:

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
    // ....
}

Angeblich ist subjectList ein Auflistungstyp wie ArrayList. Natürlich wird hier Ihr Code ausgeführt, falls der Benutzer schreibt ein Element Ihrer selectOneMenu -Liste ist.

2
Stefanos Kargas

Ich würde lieber ein bequemeres itemSelect -Ereignis verwenden. Mit diesem Event kannst du org.primefaces.event.SelectEvent Objekte in Ihrem Listener.

<p:selectOneMenu ...>
    <p:ajax event="itemSelect" 
        update="messages"
        listener="#{beanMB.onItemSelectedListener}"/>
</p:selectOneMenu>

Mit einem solchen Hörer:

public void onItemSelectedListener(SelectEvent event){
    MyItem selectedItem = (MyItem) event.getObject();
    //do something with selected value
}
2