1

如何添加服务器端在所有 ajax 响应中发送的内容,以便我可以添加自己的参数?

我已经扩展了 Richfaces JavaScriptA4J.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 响应编写代码都在那里。它没有以允许轻松添加自定义标签/脚本的方式进行抽象。你基本上需要复制'n'粘贴'n'修改它。只是不值得努力。

一种更简单的方法是自动 ajax 渲染一些<script>包含 JS 风格的所需变量的片段,以便可以将 bean 属性分配为全局 JS 变量。

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

ajaxRendered="true"确保这是在每个 ajax 请求上自动重新呈现,因此您无需将其 ID 显式添加到reRender某些 A4J 组件的属性中)

wheregetParamsAsJson()只返回一个有效 JSON 格式的 Java 字符串,例如 as { 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像这样覆盖而不是 using <a4j:status onstop="...">,但假设您只是不知道它,以下是您可以使用它的方法:

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