2010-12-01 21 views
1

Also, lassen Sie mich uns meine Probleme zeigen :)JSF - Zwei Fragen zu Aktionen auf UIComponent

1 - Wenn ich auf einem Befehlsschaltfläche klicken

<h:commandButton value="Somethings"> 
    <f:setPropertyActionListener target="#{bean.method}" value="some" /> 
    <f:ajax render="rendering"/> 
</h:commandButton> 

ich nicht jede Aktion zu die commandButton. Ich feuere nur den Ajax-Anruf. Wenn ich eine Aktion auf der Schaltfläche hinzufüge (wie action="bean.myAction), wird sie in der 5 ° -Phase des JSF-Lebenszyklus ausgeführt (in Ordnung, nur wenn ich event = "action" in f: ajax schreibe, aber das ist der Standardwert). Recht? Aber der f: Ajax wird gefeuert, indem man auf den Button als Standard klickt? Denn für eine ListBox zum Beispiel wird es nur gefeuert, wenn ich event = "change" schreibe (das gleiche, ich sollte es nicht schreiben, weil das standardmäßig ist).

2 - Wenn ich auf das Bild klicken

<h:graphicImage value="img/img.png" alt="img"> 
    <f:setPropertyActionListener target="#{bean.method}" value="some" /> 
    <f:ajax event="onclick" render="rendering"/> 
</h:graphicImage> 

Dies funktioniert nicht. Warum?

Wie immer, danke für die Hilfe !!!!

Antwort

1

1 - Wenn ich auf einem Befehlsschaltfläche klicken

ich nicht auf die Befehlsschaltfläche jede Handlung tun. Ich feuere nur den Ajax-Anruf. Wenn ich eine Aktion auf die Schaltfläche (wie action = "bean.myAction) hinzufügen, wird es executedat die 5 ° Phase des JSF-Lebenszyklus sein

Die f:setPropertyActionListener wird auch in der fünften Phase ausgeführt werden.

(alles klar, nur wenn ich Event = "action" in f: ajax schreibe, aber das ist standardmäßig). Richtig? Aber das f: ajax wird durch Klicken auf die Schaltfläche als Standard ausgelöst? Zum Beispiel für eine ListBox es wird gefeuert nur wenn ich write = "change" schreibe (das gleiche, ich sollte es nicht schreiben, weil das als Standard ist)

Die f:ajax ändert nur das Verhalten von einem synchronen Senden an asynchronen (teilweisen) Senden. Dies wird dadurch erreicht, dass zusätzlicher JavaScript-Code für das gewünschte Ereignisattribut der Elternkomponente erzeugt wird (z. B. onclick, onchange usw., siehe generierte HTML-Ausgabe im Webbrowser). Es ändert nichts im JSF-Lebenszyklus. Nur die gerenderte Antwort ist eine Teilantwort, die genau der Teil ist, der in den Komponenten mit der ID, wie im Attribut render definiert, aktualisiert werden soll.


2 - Wenn ich auf das Bild klicken

Dies funktioniert nicht. Warum?

Weil die h:graphicImagef:setPropertyActionListener überhaupt nicht unterstützt. Es funktioniert nur in UICommand Komponenten.

Sie möchten es stattdessen in eine wickeln.

<h:commandLink> 
    <f:setPropertyActionListener target="#{bean.method}" value="some" /> 
    <f:ajax event="action" render="rendering"/> 
    <h:graphicImage value="img/img.png" alt="img"/> 
</h:commandLink> 

+0

für die erste Frage (und ggf. Stil der Grenze/Unterstrichen durch erzeugte <a> Element weg mit CSS verursacht): OK. Aber was ich noch nicht verstehe, ist folgendes: Für eine ListBox wird das 'f: ajax' aufgerufen, wenn sich zB ListBox ändert. ('event =" ändern "'). Aber für den Knopf? Wie sagst du, dass wenn du es drückst, du den Code darauf ausführen musst? Es ist das Standardverhalten, denke ich, oder ich habe etwas vergessen? – markzzz

+0

Das Standardereignis 'f: ajax' für' UICommand' (eigentlich 'ActionSource') Komponenten ist' click'. Siehe auch die Beschreibung des Attributs 'event' im PDL-Dokument 'f: ajax', das ich in meiner Antwort verlinkt habe (alle diese bläulichen Codeteile in meiner Antwort sind tatsächlich Links zu der offiziellen Referenzdokumentation). – BalusC

+0

Uhm. Wenn ich also meine eigene 'action =" bean.myFunction "' auf 'commandButton' schreibe und ich' f: ajax event = "click" 'verwende, wird die Aktion nicht ausgeführt? – markzzz