我定义了一个通用的ajaxComplete函数,在每个ajax请求之后触发,如下所示;
$(document).on('pfAjaxComplete', function(event, xhr, options) {
doStuff();
});
注意我使用pfAjaxComplete而不是ajaxComplete来在PrimeFaces下工作
现在,在每个ajaxcomplete上'doStuff()'函数正在被调用。问题是,在'doStuff()'函数中,我触发了几个ajax调用,以基于PrimeFaces remoteCommand
执行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}" />
工作正常,正在调用后台bean操作方法。问题是新的ajax回调'doStuff'触发一个新的ajaxOnComplete事件,这当然是有意义的,但它让我在一个无限循环。我曾试图解决这个问题,但找不到任何解决办法。
有什么想法或建议吗?是否有一种方法可以在newAjaxCallBack上发送一个参数,然后在ajaxComplete函数上检测它,以避免doStuff调用?谢谢!
一个快速的解决方案是在你不希望执行其他操作的调用中附加额外的参数。
如果您选择的"参数"没有在目标页面上使用,则它不会关心它。
$(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'}
]
});
}
http://jsfiddle.net/3kwhn0kx/最终得到了它的工作,解决方案类似于@dognose一个,在我的情况下,我不得不使用数据的主面处理,这样;
...
$.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对象,它有一个属性'data',基本上是一个字符串,包含与请求相关的信息,包括参数,所以如果参数存在,不要做任何事情。