0

我知道我可以使用 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();

但它们似乎不起作用。如果该方法返回一个值,这似乎也没有效果。到目前为止,我发现的最简单的方法就是抛出一个异常,但这个解决方案远非干净。

4

2 回答 2

1

它相当hacky,但通过跟踪堆栈,我找到了解决方案。Wicket 将组件的回调处理程序视为特权。如果您正在注册一个IAjaxCallListener,它将被允许返回falseWicket 读取的内容以及停止传播的内容。“全局”事件侦听器由于某种原因被拒绝此特权,这就是为什么必须将返回值偷偷带入一个尚不存在的前置条件处理程序数组中。它很乱,但它有效。

Wicket.Event.subscribe('/ajax/call/before', function (jqEvent, 
    attributes, 
    jqXHR, 
    errorThrown, 
    textStatus) {
      if (precondition) {
        attributes.pre = [stopWicket];
      }
    }
});

function stopWicket() {
    return false;
}

无论如何。谁将某事称为“先决条件”,但忽略了在此先决条件处理程序上做出的决定....

于 2014-03-13T14:26:50.953 回答
0

订阅者不能停止 Ajax 处理。

为什么不为此使用前提条件?请参阅 AjaxRequestAttributes#getAjaxCallListeners() 和 IAjaxCallListener#getPrecondition()。

于 2014-03-13T13:51:55.053 回答