JavaScript应该调用Wicket吗.Ajax.Ajax触发页面重载(Wicket v6.13)



我想将ajax事件从浏览器发送到wicket面板,这样它就可以刷新标签的内容。我还需要从javascript函数发送这个请求。

它工作得很好——正在发送ajax请求,并且rest包含预期的更新标签:

Ajax请求:

http://localhost:8080/cyclop/cyclop/ced?1-3.IBehaviorListener.0-historyPanel&_=1392727280955

和响应:

<?xml version="1.0" encoding="UTF-8"?><ajax-response><component id="idf" ><![CDATA[<div id="idf">6</div>]]></component></ajax-response>

问题是,我还可以在网络监视器中看到另一个请求:它获取整个页面的内容。它不重新加载页面本身,只是获取其内容。

原因是什么?这正常吗

编辑:我能够更深入地研究它:wicket触发两个ajax请求:

  1. localhost:8080/cycop/cycop/ed?2-这个返回整页
  2. localhost:1511/cip/cip/ed?2-11.IBehaviorListener.0-历史面板-这是一个ajax响应

这是代码:

HTML页面的一部分包含触发ajax请求的链接:

<li><div class="cq-tabHistory">MY LINK</div></li>

和注册wicket回调的java脚本:

$(".cq-tabHistory").on("click", function() {    Wicket.Ajax.ajax({"u" : link, "c" : comp}); }

这是在服务器端上注册ajax回调的wicket面板类

Label counter ;
public HistoryPanel(String id) {
super(id);
counter= new Label("counter", new IModel<String>() {
@Override
public String getObject() {
count++;
return count + "";
}
@Override
public void setObject(String o) {
}
@Override
public void detach() {
}
});
add(counter);
counter.setOutputMarkupId(true);
}
public void init() {
browserCallback = new AbstractDefaultAjaxBehavior() {
protected void respond(final AjaxRequestTarget target) {
target.add(counter);
}
};
add(browserCallback);
browserCallbackUrl = browserCallback.getCallbackUrl().toString();
}
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(OnDomReadyHeaderItem.forScript(browserCallback.getCallbackScript()));
}

我发现了问题。

我的自定义java脚本函数通过这样的请求调用后端的wicket组件:

Wicket.Ajax.ajax({"u":"./ced?2-1.IBehaviorListener.0-historyPanel","c":"historyPanel17"});

为了在java脚本中访问这个URL,我调用了自定义的java脚本函数,该函数设置全局java脚本变量——这发生在我的组件的方法renderHead(IHeaderResponse response)中。到目前为止没有什么奇怪的。。。。

问题是,在创建AbstractDefaultAjaxBehavior之后,我在构造函数中过早地获得了回调URL。这导致了1-0.IBehaviorListener.0-historyPanel-此url包含我的组件的错误版本(其设置为0)。调用browserCallback.getCallbackUrl()必须移动到renderHead(IHeaderResponse response)-在这种情况下,它包含正确的组件id和正确的版本

我不明白你为什么会收到第二个请求。我在ajax回调中没有得到这一点。

也许您可以尝试在ajax调用中发现您的使用和普通Wicket ajax链接之间的差异?

防止ajax组件上出现(一些)额外/不需要的行为的解决方案如下:

  1. 覆盖getPreconditionScript并使其返回"return false;"以防止(一些)不必要的额外行为。如果没有这一点,在使用自定义脚本时,行为事件会在java端触发两次。

    @Override
    public CharSequence getPreconditionScript() {
    return "return false;";
    }
    @Override
    public void renderHead(IHeaderResponse response) {
    super.renderHead(response);
    response.render(OnDomReadyHeaderItem.forScript(getCallbackScript()));
    }
    

我从一些wicket文档中了解到,组件中包含的任何行为都会阻止其正常行为。当您需要提供自定义行为时,这似乎并不完全正确,因此您需要手动阻止其他"一切"。

//更新注意到,如果在creted的自定义脚本末尾包含"return false;",它将破坏同一页面上的其他一些ajax功能。它阻止发送额外的请求,你可以从网络流量中监控,例如使用firebug,但我后来发现了一个不幸的副作用。

最新更新