如何在服务器端添加所有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>
答案 0 :(得分:0)
虽然JSF2很容易将one和other标准化,但在RichFaces 3.x Ajax4jsf中这并不是一件容易的事。 Ajax响应由org.ajax4jsf.Filter
处理,后者又从BaseXmlFilter
中扩展。所有的ajax响应编写代码都在那里。它不是以这样的方式抽象的,它允许轻松添加自定义标签/脚本。你基本上需要复制'n'paste'n'修改它。这不值得努力。
更简单的方法是自动ajax渲染一些包含JS flavor中所需变量的<script>
,以便可以将bean属性指定为全局JS变量。
<a4j:outputPanel ajaxRendered="true">
<script type="text/javascript">
var parameters = <h:outputText value="#{bean.paramsAsJson}" />;
</script>
</a4j:outputPanel>
(ajaxRendered="true"
确保在每个ajax请求中自动重新呈现它,这样您就不需要将其ID显式添加到某些A4J组件的reRender
属性中)
其中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)" />
,但假设你只是不知道它,这就是你如何使用相反:
{{1}}