14

JSF 2.0、モハラ 2.0.1、PrimeFaces 3.4.1

同様の質問がありますが、sthが必要です。そうしないと; javascript 関数は、js 関数から取得したい変数を埋めるバッキング Bean メソッドを待つ必要があります。私が言いたいのは:

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

4

2 に答える 2

26

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

于 2013-02-19T20:08:39.253 に答える
11

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>
于 2013-02-19T20:09:30.147 に答える