1

独自のパラメーターを追加できるように、すべての ajax 応答で送信されるものをサーバー側に追加するにはどうすればよいですか?

カスタム イベントをトリガーするためにrichfaces JavaScript を拡張A4J.AJAX.finishRequestしました。サーバーからパラメーターを渡したいと思います。

var originalFinishRequest = A4J.AJAX.finishRequest;

A4J.AJAX.finishRequest = function(request) {
    var parameters = request.options.parameters;
    if (!request._oncomplete_aborted) {

       jQuery(document).trigger('onAutofocus',parameters);
    }
    originalFinishRequest(request);
};

それを見る別の方法は、サーバー側が A4J.AJAX.Submit への呼び出しに応答し、それを自分のコードでラップするにはどうすればよいかということです。


私の解決策

これは、BalusC の回答に基づいて、マスター テンプレートに入れることになったものです。

<a4j:outputPanel ajaxRendered="true">
  <c:if test="#{not empty flowScope.autofocusSelectors}">
    <script>
      document.autofocusSelectors = #{flowScope.autofocusSelectors};
      console.log("BASE TEMPLATE: autofocus: (#{flowScope.autofocusSelectors})");
    </script>
  </c:if>
  <script>
    console.log("BASE TEMPLATE AJAX RENDER")
    //NB: autofocusSelectors not always set, and not only reason to autofocus
    jQuery(document).trigger('onAutofocus');
  </script>
</a4j:outputPanel>
4

1 に答える 1

0

oneotherを標準化した JSF2 ではこれは簡単ですが、RichFaces 3.x Ajax4jsf では簡単ではありません。Ajax 応答が処理されorg.ajax4jsf.Filter、それが他のものから拡張されますBaseXmlFilter。すべての ajax 応答書き込みコードがそこにあります。カスタムタグ/スクリプトを簡単に追加できるように抽象化されていません。基本的に、コピーして貼り付けて変更する必要があります。努力するだけの価値はありません。

<script>簡単な方法は、Bean プロパティをグローバル JS 変数として割り当てることができるように、JS フレーバーで目的の変数を含む一部を自動 ajax レンダリングすることです。

<a4j:outputPanel ajaxRendered="true">
    <script type="text/javascript">
        var parameters = <h:outputText value="#{bean.paramsAsJson}" />;
    </script>
</a4j:outputPanel>

(これajaxRendered="true"により、すべての ajax リクエストでこれが自動再レンダリングされることが保証されるため、その ID をreRender一部の A4J コンポーネントの属性に明示的に追加する必要はありません)

getParamsAsJson()のような有効な JSON 形式の Java 文字列を返すだけです{ foo: "foo", bar: "bar" }。このようにして、あなたはただ使うことができます

A4J.AJAX.finishRequest = function(request) {
    if (!request._oncomplete_aborted) {
       jQuery(document).trigger('onAutofocus', parameters);
    }
    originalFinishRequest(request);
};

(request.options.parameters基本的には、ajax 応答を返すときにサーバー側で設定される変数ではなく、ajax 要求の起動時にクライアントによって送信される要求パラメーターが含まれていることに注意してください。そのため、最初にそれを見るのは既に間違っていました)

A4J.AJAX.finishRequestさらに、 を使用する代わりにそのようにオーバーライドしている理由が正確には<a4j:status onstop="...">わかりませんが、それを認識していなかったと仮定すると、代わりにそれを使用する方法は次のとおりです。

<a4j:status onstop="jQuery(document).trigger('onAutofocus', parameters)" />
于 2013-01-03T14:11:00.573 に答える