web-dev-qa-db-ja.com

マネージドBeanからJavaScript関数を呼び出す

JSFのマネージドBeanからJavaScript関数を呼び出す(実行する)方法はありますか?

関連する場合は、PrimeFacesも使用しています。

31
Maddy

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はありません。最良の方法は、目的のスクリプトをBeanプロパティとして設定し、Beanプロパティが空でない場合に_<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 クラス(JSF ajax応答の作成を担当)はJSF 2.0以降に既に startEval() および endEval() メソッドを使用すると、コールバックスクリプトを直接応答に書き込むことができますが、JSF 2.3が登場するまで、驚くほど公開メソッドはありませんでした PartialViewContext これらのメソッドに委任します。 issue 1412PartialViewContext#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');");
}
_

こちらもご覧ください:

45
BalusC

使用しているPrimefacesのバージョンに応じて、RequestContext.execute("{js here}");を使用できます

Primefaces 3.4ドキュメントから:

RequestContextは、ajaxリクエストの完了時にjavascriptを実行する方法を提供します。このアプローチは、コールバックパラメーターを渡して条件付きjavascriptを実行するよりも簡単です。以下の例は、ajaxリクエストが完了するとダイアログを非表示にします。

コード

public void save() {
  RequestContext requestContext = RequestContext.getCurrentInstance();  
  requestContext.execute("dialog.hide()");
}
34
mbeedub

Primefacesで最も近いものは次のとおりです。

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

3.0には拡張機能もあると言っていますが、

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

7
Cagatay Civici

単純にできません。

Managed Beanはサーバーで、JavaScriptはブラウザーで動作します。

Managedbeanに設定された値に応じて、条件付きでJavaScriptを呼び出すことができます。

4
Jigar Joshi

一般に、Javaは、スクリプトエンジンを使用して文字列を評価するAPIを提供します。これは、javax.script.ScriptEngineクラスとjavax.script.ScriptEngineManagerクラスによって実現できます。

あなたの状況が何であるかは完全にはわかりませんが、javascriptをマネージドBeanに文字列として渡すことができれば、おそらくJavaスクリプトAPIを使用してサーバー側でjavascriptを実行できます。

詳細については、次のリンクを参照してください。 http://docs.Oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html

1
Nikhil