Вызов функции JavaScript из управляемого компонента - PullRequest
30 голосов
/ 15 апреля 2011

Есть ли способ вызвать (выполнить) функцию JavaScript из управляемого компонента в JSF?

Если это актуально, я также использую PrimeFaces.

Ответы [ 5 ]

44 голосов
/ 01 июля 2015

В PrimeFaces до 6.2 вы можете использовать для этого RequestContext#execute().

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

В PrimeFaces 6.2 и выше:

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

В стандартном JSFДля этого не существует прямого публичного API.Лучшее, что вы можете получить, это установить желаемый скрипт в качестве свойства компонента и условно отобразить компонент <h:outputScript>, если свойство компонента не пусто.

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

В случае, если вы отправляетеформа с помощью ajax, не забудьте обернуть <h:outputScript> в другой компонент и вместо этого обновить его с помощью ajax.См. Также Обновление / рендеринг Ajax не работает с компонентом, который имеет атрибут рендеринга .

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

Что касается выражения «для этого оператора нет прямого открытого API», любопытно, что * Класс 1022 * (ответственный за написание ajax-ответов JSF) уже существует с JSF 2.0 startEval() и endEval() методов, которые должны позволять вам напрямую писать сценарии обратного вызовак ответу, но до предстоящей JSF 2.3, на удивление, в PartialViewContext не было публичного метода, который делегировал бы этим методам.В соответствии с выпуском 1412 PartialViewContext#getEvalScripts() наконец-то добавлено в публичный API.

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

Для более старых версий JSF это можно реализовать только путем создания пользовательской реализации PartialViewContext.Служебная библиотека JSF OmniFaces сделала именно это с OmniPartialViewContext, который можно использовать с помощью Ajax служебного класса .

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

См. Также:

34 голосов
/ 20 ноября 2012

В зависимости от того, какую версию Primefaces вы используете, вы можете использовать RequestContext.execute("{js here}");

Из документации по Primefaces 3.4:

RequestContext обеспечивает способ выполнения JavaScript, когда AJAX запрос завершен, этот подход проще по сравнению с передачей обратный вызов параметров и выполнение условного JavaScript. Пример ниже скрывает диалоговое окно, когда ajax-запрос завершается;

Код

public void save() {
  RequestContext requestContext = RequestContext.getCurrentInstance();  
  requestContext.execute("dialog.hide()");
}
7 голосов
/ 16 апреля 2011

Ближайшая вещь в Primefaces есть;

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

Сказав, что есть улучшение в 3.0;

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

4 голосов
/ 15 апреля 2011

Вы не можете просто.

Managed Bean работает на сервере и JavaScript в браузере.

Вы можете сделать условный вызов JavaScript в зависимости от значения, установленного в управлении.

1 голос
/ 17 марта 2012

Как правило, Java предоставляет API для оценки строки с использованием механизма сценариев. Это может быть достигнуто классами javax.script.ScriptEngine и javax.script.ScriptEngineManager.

Я не совсем уверен, какова ваша ситуация, но если вы можете передать javascript как строку в управляемый компонент, вы, вероятно, могли бы использовать API сценариев Java для запуска javascript на стороне сервера.

Для получения дополнительной информации, перейдите по этой ссылке: http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html

...