我已经定义了在每个ajax请求之后触发的一般ajaxComplete函数,如下所示;
$(document).on('pfAjaxComplete', function(event, xhr, options) {
doStuff();
});
注意我使用pfAjaxComplete而不是ajaxComplete在PrimeFaces下工作
现在,在每个ajaxcomplete上调用'doStuff()'函数。问题是在'doStuff()'函数内部我触发了几个基于PrimeFaces remoteCommand执行的ajax调用
function doStuff() {
var elements = $('#wrapper').find("[id*='elements']");
if (elements !== null && elements .length > 0) {
$.each(elements , function(index) {
newAjaxCallBack([{name: 'param', value: 'val'}]);
});
}
}
我的远程命令
<p:remoteCommand name="newAjaxCallBack" actionListener="#{backingBean.action}" />
这很好用,正在调用backing bean action方法。问题是'doStuff'上新的ajax回调触发了一个新的ajaxOnComplete事件,这当然有道理,但后来它让我无限循环。曾试图解决它,但找不到任何解决方案。
有任何想法或建议吗?有没有办法在newAjaxCallBack上发送一个参数,然后在ajaxComplete函数上检测它,以避免doStuff调用?谢谢!
答案 0 :(得分:1)
快速解决方案是在您不希望执行其他操作的来电中添加其他参数。
如果您选择&#34; paremeter&#34;它没有在目标页面上使用,它不会关心它。
$(document).ajaxComplete(function(event, xhr, options) {
if (options.url.indexOf("noStuff=true") != -1){
alert("Ignoring Ajax Request from noStuff");
return;
}
doStuff();
});
function doStuff(){
alert("doing stuff");
//another fake ajax request
$.ajax({
url: "http://google.de",
data: [
{name: 'param', value: 'val'},
{name: 'noStuff', value: 'true'}
]
});
}
答案 1 :(得分:1)
最后得到它的工作,解决方案类似于@dognose一个,在我的情况下我不得不使用数据primefaces处理,这样;
...
$.each(elements , function(index) {
newAjaxCallBack([{name: 'dontcall', value: 'true'}]);
});
...
然后:
$(document).on('pfAjaxComplete', function(event, xhr, options) {
if (xhr.pfSettings.data.indexOf('dontcall') !== -1) {
return;
}
doStuff();
});
正如您所看到的,我正在使用pfSettings对象,该对象具有属性&#39;数据&#39;这基本上是一个字符串,其中包含与请求相关的信息,包括参数,所以如果参数存在,则不要做任何事情。