JSF 2.0、Mojarra 2.0.1、PrimeFaces 3.4.1
同様の質問がありますが、私はsthが必要です。そうしないと; JavaScript関数は、バッキングBeanメソッドを待機する必要があります。これは、js関数からプルしたい変数を埋めています。私が言いたいのは:
<p:commandLink action="#{statusBean.getStatuses}" oncomplete="afterLoad()"/>
Js関数が値を取得して画面に出力することを前提としています。
function afterLoad() {
alert("#{statusBean.size}");
}
そしてここに誕生日の子供があります:
@ManagedBean
@ViewScoped
public class StatusBean {
public int size=0;
List<Status> panelList = new ArrayList<Status>();
public void getStatuses() {
this.panelList = fillList();
this.size = panelList.size(); //Assuming 3
}
//getter and setters
}
したがって、関数はサイズがその初期値である0であると警告しますが、3が表示されることを期待しています。
動作方法:@PostConstruct
アノテーションをBeanのヘッドに追加すると、ページがロードされる前にBeanがすでに構築されているため、正しいサイズが確実に得られます。しかし、これは冗長なプロセスを意味し、コマンドリンクアクションの直後に必要な値です。では、js関数を延期するにはどうすればよいですか?何か案は?
JSF/ELとHTML/JSは同期して実行されません。代わりに、JSF/ELはWebサーバーで実行され、Webブラウザーで実行されるHTML/JSを生成します。ブラウザでページを開き、右クリックしてソースを表示します。ほら、JSF/ELの1行はありません。それはすべてのHTML/JSです。 JS関数の代わりに、以下が表示されます。
_function afterLoad() {
alert("0");
}
_
このJS関数は、コマンドボタンのアクションが完了すると呼び出されます。したがって、結果は完全に予想されます。
基本的に、JSFにそのJSの一部を再レンダリングさせる必要があります。
_<p:commandLink action="#{statusBean.getStatuses}" update="afterLoad" oncomplete="afterLoad()"/>
<h:panelGroup id="afterLoad">
<h:outputScript>
function afterLoad() {
alert("#{statusBean.size}");
}
</h:outputScript>
</h:panelGroup>
_
何も言わなかった具体的な機能要件によっては、よりエレガントな方法があるかもしれません。たとえば、RequestContext#execute()
、_<o:onloadScript>
_などです。
JavaScriptのELは、ページがレンダリングされたときに計算され、そのコンテナーを更新できます(JSFコンポーネント内にある場合)。ただし、別のアプローチをお勧めします。
AJAX=リクエストを作成するときに、getStatuses()
メソッドにコールバックパラメータを追加できます。PrimefacesのRequestContext
ユーティリティメソッドaddCallBackParam()
を使用できますこのため:
public void getStatuses() {
this.panelList = fillList();
this.size = panelList.size();
RequestContext.getCurrentInstance().addCallBackParam("size", this.size);
}
このパラメーターはxhtmlで使用できます。
<p:commandLink action="#{statusBean.getStatuses}" oncomplete="afterLoad(xhr, status, args)"/>
<script type="text/javascript">
function afterLoad(xhr, status, args) {
alert(args.size);
}
</script>