webentwicklung-frage-antwort-db.com.de

Aufruf einer JavaScript-Funktion aus einem Managed Bean

Gibt es eine Möglichkeit, eine JavaScript-Funktion aus einer verwalteten Bean in JSF aufzurufen (auszuführen)?

Wenn das relevant ist, verwende ich auch PrimeFaces.

31
Maddy

In PrimeFaces vor 6.2 können Sie hierfür RequestContext#execute() verwenden.

public void submit() {
    // ...
    RequestContext.getCurrentInstance().execute("alert('peek-a-boo');");
}

In PrimeFaces 6.2 und höher:

public void submit() {
    // ...
    PrimeFaces.current().executeScript("alert('peek-a-boo');");
}

In Standard-JSF gibt es dafür keine direkte öffentliche API. Sie können das gewünschte Skript am besten als Bean-Eigenschaft festlegen und eine <h:outputScript> - Komponente unter bestimmten Bedingungen rendern, wenn die Bean-Eigenschaft nicht leer ist.

<h:commandButton ... action="#{bean.submit}" />
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
public void submit() {
    // ...
    script = "alert('peek-a-boo');";
}

Wenn Sie das Formular von Ajax senden, vergessen Sie nicht, das <h:outputScript> In eine andere Komponente zu packen und es stattdessen mit Ajax zu aktualisieren. Siehe auch Ajax Update/Render funktioniert nicht für eine Komponente, die das Attribut Rendered hat .

<h:commandButton ... action="#{bean.submit}">
    <f:ajax execute="@form" render="script" />
</h:commandButton>
<h:panelGroup id="script">
    <h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
</h:panelGroup>

Was "es gibt keine direkte öffentliche API für diese" -Anweisung betrifft, hat die Klasse PartialResponseWriter (verantwortlich für das Schreiben von JSF-Ajax-Antworten) merkwürdigerweise bereits seit JSF 2.0 startEval() und endEval() Methoden, mit denen Sie Callback-Skripte direkt in die Antwort schreiben können. Bis zum kommenden JSF 2.3 gab es jedoch überraschenderweise keine öffentliche Methode in PartialViewContext welches an diese Methoden delegiert. Gemäß Ausgabe 1412PartialViewContext#getEvalScripts() wurde der öffentlichen API endlich hinzugefügt.

public void submit() {
    // ...
    FacesContext.getCurrentInstance().getPartialViewContext().getEvalScripts().add("alert('peek-a-boo');");
}

Bei älteren JSF-Versionen kann dies nur durch Erstellen einer benutzerdefinierten PartialViewContext -Implementierung implementiert werden. Die JSF-Dienstprogrammbibliothek OmniFaces hat genau das mit OmniPartialViewContext getan, das über Ajax Dienstprogrammklasse verwendet werden kann.

public void submit() {
    // ...
    Ajax.oncomplete("alert('peek-a-boo');");
}

Siehe auch:

45
BalusC

Abhängig davon, auf welcher Version von Primefaces Sie sich befinden, können Sie RequestContext.execute("{js here}"); verwenden.

Aus der Dokumentation zu Primefaces 3.4:

RequestContext bietet eine Möglichkeit, Javascript auszuführen, wenn die Ajax-Anforderung abgeschlossen ist. Dieser Ansatz ist einfacher als das Übergeben von Callback-Parametern und das Ausführen von bedingtem Javascript. Das folgende Beispiel verbirgt den Dialog, wenn die Ajax-Anforderung abgeschlossen ist.

Code

public void save() {
  RequestContext requestContext = RequestContext.getCurrentInstance();  
  requestContext.execute("dialog.hide()");
}
34
mbeedub

Das Nächste in Primefaces ist;

http://www.primefaces.org/showcase/ui/callbackParams.jsf

Allerdings gibt es auch eine Verbesserung in 3.0;

http://code.google.com/p/primefaces/issues/detail?id=1342

7
Cagatay Civici

Sie können nicht einfach.

Managed Bean funktioniert auf dem Server und JavaScript im Browser.

Sie können JavaScript abhängig von dem in managedbean festgelegten Wert bedingt aufrufen

4
Jigar Joshi

Im Allgemeinen stellt Java eine API zum Auswerten einer Zeichenfolge mithilfe einer Skript-Engine bereit. Dies kann durch die Klassen javax.script.ScriptEngine und javax.script.ScriptEngineManager erreicht werden.

Ich bin nicht ganz sicher, wie Ihre Situation ist, aber wenn Sie das Javascript als Zeichenfolge an die verwaltete Bean übergeben können, könnten Sie wahrscheinlich Java Skript-API verwenden, um das Javascript auf der Serverseite auszuführen.

Weitere Informationen finden Sie unter folgendem Link: http://docs.Oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html

1
Nikhil