web-dev-qa-db-ja.com

JavaScriptでバッキングBeanの値を取得する

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関数を延期するにはどうすればよいですか?何か案は?

13

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>_などです。

25
BalusC

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