Appel d'une fonction JavaScript à partir de managed bean

y a-t-il un moyen d'appeler (exécuter) une fonction JavaScript de managed bean dans JSF?

si c'est pertinent, j'utilise aussi des PrimeFaces.

25
demandé sur BalusC 2011-04-15 13:49:01

5 réponses

selon la version de Primefaces que vous utilisez, vous pouvez utiliser RequestContext.execute("{js here}");

De la Primefaces 3.4 documentation:

RequestContext fournit un moyen d'exécuter javascript lorsque l'ajax demande terminée, cette approche est plus facile par rapport à passer callback params et exécute javascript conditionnel. L'exemple ci-dessous cache la boîte de dialogue lorsque la requête ajax est terminée;

Code

public void save() {
  RequestContext requestContext = RequestContext.getCurrentInstance();  
  requestContext.execute("dialog.hide()");
}
32
répondu mbeedub 2015-05-02 16:47:05

dans PrimeFaces pre 6.2, vous pouvez utiliser RequestContext#execute() pour cela.

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

en PrimeFaces 6.2 et plus:

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

dans le JSF standard, il n'y a pas D'API publique directe pour cela. Ce que vous pouvez obtenir de mieux est de définir le script désiré comme une propriété bean et de rendre conditionnellement un composant <h:outputScript> lorsque la propriété bean n'est pas vide.

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

dans le cas vous soumettez le formulaire par ajax, n'oubliez pas d'envelopper le <h:outputScript> dans un autre composant et ajax-mettez-le à jour à la place. Voir aussi Ajax update/render ne fonctionne pas sur un composant qui a rendu l'attribut .

<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>

quant à "il n'y a pas D'API publique directe pour cette" déclaration, curieusement la classe PartialResponseWriter (responsable de la rédaction des réponses ajax JSF) a déjà depuis JSF 2.0 startEval() et endEval() méthodes qui devraient vous permettre d'écrire des scripts de rappel directement à la réponse mais jusqu'à JSF 2.3 à venir il n'y a étonnamment aucune méthode publique dans PartialViewContext qui déléguera à ces méthodes. Comme dans numéro 1412 PartialViewContext#getEvalScripts() est finalement ajouté à L'API publique.

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

pour les versions JSF plus anciennes, cela ne peut être implémenté en créant une implémentation personnalisée PartialViewContext . JSF utility library OmniFaces a fait exactement cela avec OmniPartialViewContext qui peut être utilisé via Ajax classe d'utilité .

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

voir aussi:

32
répondu BalusC 2018-03-03 21:43:28

la chose la plus proche dans Primefaces est;

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

ayant dit qu'il y a aussi une amélioration dans 3.0;

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

7
répondu Cagatay Civici 2011-04-15 22:21:26

vous ne pouvez pas simplement.

Managed Bean fonctionne sur le serveur et JavaScript sur le navigateur.

vous pouvez faire appel conditionnellement à JavaScript en fonction de la valeur définie dans managedbean

4
répondu Jigar Joshi 2011-04-15 09:52:52

en général, Java fournit une API pour évaluer une chaîne à l'aide d'un moteur de script. Ceci peut être accompli par javax.script.ScriptEngine et javax.script.ScriptEngineManager classes.

Je ne suis pas tout à fait sûr de votre situation, mais si vous pouvez passer le javascript comme une chaîne de caractères au bean géré, vous pouvez probablement utiliser Java scripting API pour exécuter le javascript du côté du serveur.

Pour plus d'informations, consultez ce lien: http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html

1
répondu Nikhil 2012-03-16 23:52:31