Есть ли способ вызвать (выполнить) функцию JavaScript из управляемого bean в JSF?
Если это актуально, я также использую PrimeFaces.
Есть ли способ вызвать (выполнить) функцию JavaScript из управляемого bean в JSF?
Если это актуально, я также использую PrimeFaces.
В 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 для этого" оператора, то, что любопытно, что класс PartialResponseWriter
(ответственный за написание ajax-ответов JSF) уже существует с startEval()
JSF 2.0 startEval()
и endEval()
которые должны позволять вам писать сценарии обратного вызова непосредственно в ответ, но до PartialViewContext
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');");
}
В зависимости от версии версии Primefaces вы можете использовать RequestContext.execute("{js here}");
Из документации Primfaces 3.4:
RequestContext предоставляет способ выполнения javascript, когда ajax запрос завершен, этот подход проще по сравнению с прохождением callback params и выполнить условный javascript. Пример ниже скрывает диалог, когда запрос ajax завершается;
код
public void save() {
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.execute("dialog.hide()");
}
Ближайшая вещь в Primefaces:
http://www.primefaces.org/showcase/ui/callbackParams.jsf
Сказав, что есть еще и усовершенствование в 3.0;
Вы не можете просто.
Managed Bean
работает на сервере и JavaScript в браузере.
Вы можете условно вызывать JavaScript в зависимости от значения, установленного в managedbean
В общем, Java предоставляет API для оценки строки с использованием механизма сценариев. Это может быть выполнено с помощью классов javax.script.ScriptEngine и javax.script.ScriptEngineManager.
Я не совсем уверен, какова ваша ситуация, но если вы можете передать javascript как строку управляемому bean, вы, вероятно, можете использовать API сценариев Java для запуска javascript на стороне сервера.
Для получения дополнительной информации ознакомьтесь с этой ссылкой: http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html