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.
5 réponses
selon la version de Primefaces que vous utilisez, vous pouvez utiliser RequestContext.execute("{js here}");
De la Primefaces 3.4 documentation:
CodeRequestContext 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;
public void save() {
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.execute("dialog.hide()");
}
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:
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;
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
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