2017-02-24 3 views
0

Ich versuche, einen Wert von meinem Kalender über Ajax zu bekommen.Primefaces Kalender nicht feuerndateSelect

xhtml Teil:

<p:calendar 
    id="newSimFrom" 
    value="#{SimModel.from}" <!-- this works --> 
    showOn="button" 
    mask="true" 
    pattern="dd.MM.yyyy" 
>      
    <p:ajax event="dateSelect" process="@this" update="newSimUnt" listener="#{SimController.simFromChanged()}" /> 
</p:calendar> 

Controller:

public void simFromChanged(SelectEvent se) { 
    log.info("called"); 
    log.info(""+se.getObject()); 
    //this is temporary till I can figure out what's even going on 
} 

Aber ich nichts bekommen, scheint kein Ereignis ausgelöst werden. Ich habe auch versucht, event="change" sowie event="select" und process="@this" (letztere als durch https://stackoverflow.com/a/42295586 vorgeschlagen)

Auch habe ich versucht, den Hörer setzen auf mit und ohne die parenthesises, schien es keine Unterschiede zu machen.

Der Kalender befindet sich in einem Formular-Tag. (Kinda, es gibt 2 Schichten, wenn <div> oben, macht das einen Unterschied?) https://stackoverflow.com/a/17213127/7591918

Irgendwelche Ideen, wo ich zum Debuggen gehen sollte, was los ist? Ich bin relativ neu in Primefaces und JSF als Ganzes, meine IDE-Konsole und meine Browser-Konsole geben mir keine Fehler.

Danke!

Antwort

0

So Anscheinend war mein Problem mit, wie Spring intern Klassen-Adressen, oder besser gesagt, wie die automatische Namensgenerierung funktioniert, da ich die Bean nicht explizit benannt habe.

listener="#{SimController.newSimFromChanged}" 

wurde

geändert
listener="#{simController.newSimFromChanged}" 

(beachten Sie die Klein s)

Und jetzt funktioniert es.

Das ist ziemlich unintuitiv (IMO), und ich bin mir nicht sicher, dass dies universell anwendbar ist, aber ich werde das hier lassen, wenn jemand anderes das gleiche Problem hat. Beachten Sie, dass dies auch nicht gilt, wenn Ihre Klasse mit mehreren Großbuchstaben beginnt. Wenn ich meine Klasse SIMController benannt hätte, hätte das sofort funktioniert.

0

Die Methode in Ihrem Listener ist nicht korrekt geschrieben. Du hast das "Neue" vergessen.

Wenn Sie das Ereignis erhalten möchten, verwenden Sie keine Klammern.

Das Ereignis, das Sie erhalten, ist eine DateSelectEvent, so sollte diese Arbeit:

xhtml:

<p:ajax event="dateSelect" process="@this" update="newSimUnt" listener="#{SimController.newSimFromChanged}" /> 

Controller:

public void newSimFromChanged(DateSelectEvent se) { 
    log.info("called"); 
    log.info("" + se.getDate()); 
    //this is temporary till I can figure out what's even going on 
} 

Wenn das nicht funktioniert, muss der Fehler irgendwo sein sonst.

+0

Ah, nein, lass mich das reparieren. Es ist in meinem tatsächlichen Code richtig geschrieben, ich habe es heruntergeschnitten, um es für StackOverflow lesbarer zu machen. Edit: Um es herunterzuspielen, ich meine nicht, dass ich irgendetwas weggelassen habe, ich habe nur die Funktionsnamen geändert. – Wep0n

0

Wep0n, versuchen Sie diese Beispiele:

<p:calendar id="newSimFrom" value="#{SimModel.from}" 
      showOn="button" mask="true" pattern="dd.MM.yyyy"> 

      <p:ajax event="dateSelect" update="newSimUnt" 
        listener="#{SimController.simFromSelected}" /> 

      <f:ajax event="change" execute="@this" render="newSimUnt" 
        listener="#{SimController.simFromChanged}"/> 
</p:calendar> 

Und in Ihrem managedBean SimController:

public void simFromSelected(DateSelectEvent event) { 
    System.out.println("DateSelectEvent " + event.getDate()); 
} 

public void simFromChanged(AjaxBehaviorEvent event) throws MWSException { 
    System.out.println("AjaxBehaviorEvent " + event.getDate()); 
} 
+0

DateSelectEvent ist veraltet und nicht mehr in der von mir verwendeten Version von Primefaces enthalten. Ich habe meinen Code größtenteils richtig gemacht, abgesehen von dem, was ich in meiner eigenen Antwort gesagt habe. Danke, auf jeden Fall werde ich in AjaxBehaviourEvent für zukünftige Referenz schauen. – Wep0n