web-dev-qa-db-fra.com

Appel d'une fonction JavaScript à partir d'un bean géré

Existe-t-il un moyen d'appeler (exécuter) une fonction JavaScript à partir d'un bean géré dans JSF?

Si cela est pertinent, j'utilise également PrimeFaces.

31
Maddy

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

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

Dans PrimeFaces 6.2 et versions ultérieures:

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

Dans JSF standard, il n'y a pas d'API publique directe pour cela. Le mieux que vous puissiez obtenir est de définir le script souhaité en tant que propriété de bean et de rendre conditionnellement un composant <h:outputScript> Lorsque la propriété de 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 où vous soumettez le formulaire par ajax, n'oubliez pas d'envelopper le <h:outputScript> Dans un autre composant et ajax-le mettre à jour à la place. Voir aussi la mise à jour/rendu Ajax ne fonctionne pas sur un composant ayant un attribut rend .

<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 à la déclaration "il n'y a pas d'API publique directe pour cela", curieusement la classe PartialResponseWriter (responsable de l'écriture 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 dans la réponse mais jusqu'à JSF 2.3 à venir, il n'y avait étonnamment aucune méthode publique dans PartialViewContext qui déléguera à ces méthodes. Selon problème 1412PartialViewContext#getEvalScripts() a finalement été ajouté à l'API publique.

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

Pour les anciennes versions de JSF, cela ne peut être implémenté qu'en créant une implémentation PartialViewContext personnalisée. La bibliothèque d'utilitaires JSF OmniFaces a fait exactement cela avec OmniPartialViewContext qui peut être utilisée via Ajax classe utilitaire .

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

Voir également:

45
BalusC

Selon la version de Primefaces sur laquelle vous vous trouvez, vous pouvez utiliser RequestContext.execute("{js here}");

De la documentation Primefaces 3.4:

RequestContext fournit un moyen d'exécuter du javascript une fois la requête ajax terminée, cette approche est plus facile que de passer des paramètres de rappel et d'exécuter du javascript conditionnel. L'exemple ci-dessous masque 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()");
}
34
mbeedub

La chose la plus proche dans Primefaces est;

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

Cela dit, il existe également une amélioration dans 3.0;

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

7
Cagatay Civici

Vous ne pouvez pas simplement.

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

Vous pouvez faire invoquer conditionnellement JavaScript en fonction de la valeur définie dans managedbean

4
Jigar Joshi

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

Je ne suis pas entièrement sûr de votre situation, mais si vous pouvez transmettre le javascript en tant que chaîne au bean géré, vous pouvez probablement utiliser Java API de script pour exécuter le javascript côté serveur.

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

1
Nikhil