我知道我可以subscribe to events using Wicket 6+这就是我在申请中所做的事情。现在我试图在特定情况下取消Ajax事件,例如:
Wicket.Event.subscribe('/ajax/call/before', function (jqEvent,
attributes,
jqXHR,
errorThrown,
textStatus) {
if(someCondition) {
// Abort event, but how?
}
});
我正在寻找一种方法来中止事件,但是正常的jQuery事件处理程序
jqEvent.stopImmediatePropagation();
jqEvent.preventDefault();
甚至
attributes.event.stopImmediatePropagation();
attributes.event.preventDefault();
但它们似乎不起作用。如果该方法返回一个值,这似乎也没有效果。到目前为止我发现的最容易的只是抛出一个例外,但这个解决方案远非干净。
答案 0 :(得分:1)
这是相当hacky但是通过跟随堆栈我找到了解决方案。 Wicket将组件的回调处理程序视为特权。如果您正在注册IAjaxCallListener
,则可以返回由Wicket读取的false
以及停止传播的内容。 "全球"事件监听器由于某种原因被拒绝了这个特权,这就是为什么必须将返回值伪装成一个尚未存在的前提条件处理程序数组的原因。它很麻烦,但它确实有效。
Wicket.Event.subscribe('/ajax/call/before', function (jqEvent,
attributes,
jqXHR,
errorThrown,
textStatus) {
if (precondition) {
attributes.pre = [stopWicket];
}
}
});
function stopWicket() {
return false;
}
反正。谁称之为"前提条件"但是忽略了对这个前提条件处理程序做出的决定......
答案 1 :(得分:0)
订阅者无法停止Ajax处理。
为什么不为此使用先决条件?请参阅AjaxRequestAttributes#getAjaxCallListeners()和IAjaxCallListener#getPrecondition()。