Aufruf-listener bean beim drücken von enter in JSF 2 h:inputText
Bin ich derzeit Schreibe meine erste JSF-2 Seite-und ich möchte, um folgende Prinzipien umzusetzen:
Wenn der user etwas schreibt, was in einer h:inputText-element und drückt die enter-Taste ein weiteres h:inputText sollte aktualisiert werden mit ein paar Daten aus einer Datenbank.
Meine Testseite enthält den folgenden code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
<h3>JSF 2.0 Example</h3>
<h:form>
<h:inputText id="inputField" value="#{helloBean.name}">
<f:ajax render="output" execute="inputField" event="keypress" listener="#{bean.myChangeListener}" />
</h:inputText>
<h2><h:outputText id="output" value="#{helloBean.name}" /></h2>
</h:form>
</h:body>
</html>
Die Bohne enthält alle nötigen Getter und setter und diese Funktion:
public void myChangeEvent( AjaxBehaviorEvent event) {
System.out.println( "VALUE CHANGED" );
}
UPDATE 2013-12-16:
Nach Stunden der Fehlersuche habe ich das problem gefunden warum nichts eingereicht wurde beim verlassen des textfield-Objekts oder drücken Sie die EINGABETASTE in das textfield. Meine web-Anwendung erstellt wurde, mit Vorlagen und in die Vorlage für meine page header eine "a4j:status" - tag und dieser war im Konflikt mit JSF 2. Nach dem entfernen der "a4j:status" -Zeile der myChangeEvent Methode wird aufgerufen, wenn ich Sie irgendwo anders auf der web-Seite nach der Bearbeitung der textfield-Wert.
Aber es gibt noch das problem, dass die ganze Seite vorgelegt wird, die beim Klick auf enter nach der änderung des textfield-Wert. Das ist weil ich auf eine Schaltfläche am unteren Rand der Seite das speichert die Benutzereingabe und deshalb unterwirft sich die ganze Seite, das ist OK. Aber sollte diese Schaltfläche nicht aufgerufen werden, wenn Sie die EINGABETASTE drücken in das textfield. Was ich noch hinzufügen zu meinem bestehenden code?
UPDATE 2013-12-17:
Nach einigem ärger mit JS habe ich es endlich funktioniert mit der Hilfe von L-Ray (danke nochmal).
Hier zeige ich die endgültige und lauffähige version mit JQuery:
<h:inputText id="inputField" value="#{helloBean.name}" >
<f:ajax render="output" execute="inputField" event="change" listener="#{helloBean.myChangeEvent}" />
</h:inputText>
<h2><h:outputText id="output" value="#{helloBean.name}" /></h2>
<script type="text/javascript">
$(document).ready(function() {
$( "#mainForm\\:inputField" ).bind('keypress', function(e) {
var keyCcode = e.keyCode || e.which;
//Enter was pressed
if(keyCcode == 13) {
e.target.blur();
e.stopPropagation();
return false;
} else {
return true;
}
});
});
</script>
- Ist der Wegfall der
listener
Attribut auf<f:ajax>
ein Tippfehler? - Oh, ich bin sorry das war ein copy n paste-Fehler, aber immer noch die listener (die myChangeListener-Methode in der bean) nicht genannt
- Standard, sagt der change-listener muss die Signatur
public void processAjaxBehavior(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException)
. Hat die Anpassung Ihrer Zuhörer, die das Problem beheben? - Ich habe versucht die AjaxBehaviorEvent und auch versuchte, die keine parameter, aber das Ergebnis ist das gleiche
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde vorschlagen, nicht mit der
listener="#{bean.myChangeEvent}"
Attribut in derinputText
(es erwartet, dass dieValueChangeEvent
), aber ein Hörer Anruf von derf:ajax
, die erwartet, dass entweder keine parameter oder eineAjaxBehaviorEvent
.Ich würde auch empfehlen, nicht zu hören, um ein keypressed-Ereignis innerhalb der
f:ajax
aber für ein change-event, zusammen mit einem javascript - keypress - Ereignis.So eine Lösung, vielleicht ist der folgende code könnte für Sie arbeiten...
einer der managed bean
Den
event
Objekt gegeben werden, in unserer javascript-Teil des Browsers selbst - So läuft das außerhalb einer auf* - Attribut wird nicht funktionieren.Wird die javascript-Methode
event.stopPropagation()
ist ein jQuery-Methode oder seamingly auch eine javascript-Methode (siehe W3C-Schule), verhindern, dass andere Ereignisse aufgerufen werden, sprudeln nach unten den DOM-Baum.stopPropagation()
- drücken<Enter>
vorlegen wird, der die ganze form standardmäßig, die der Benutzer wahrscheinlich nicht wollen, in diesem Kontext.a4j:ajax
leicht in der Vergangenheit.alert('hi');
in der Funktion, einfach um zu sehen, wenn es aufgerufen wird, richtig.onkeypress
, das war der Teil, den ich konnte nicht copy & Paste 😉function(e)
- Rahmen. Sollte jetzt funktionieren. 🙂