我想从浏览器向wicket面板发送ajax事件,以便它可以刷新标签的内容。我还需要从javascript函数发送此请求。
它确实有效 - 正在发送ajax请求,并且repose包含预期的更新标签:
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请求:
以下是代码:
包含触发ajax请求的链接的HTML页面的一部分:
<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()));
}
答案 0 :(得分:3)
我发现了问题。
我的自定义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
- 此网址包含我的组件的错误版本(其设置为0)。调用browserCallback.getCallbackUrl()
必须移至renderHead(IHeaderResponse response)
- 在这种情况下,它包含正确的组件ID和正确的版本
答案 1 :(得分:0)
我看不出你为什么得到第二个请求。我在我的ajax回调中没有得到它。
也许您可以尝试在使用和简单的Wicket ajax链接之间发现ajax调用的差异?
答案 2 :(得分:0)
防止(某些)ajax组件上的其他/不需要的行为的解决方案如下:
覆盖getPreconditionScript并使其返回&#34;返回false;&#34;防止(某些)不必要的额外行为。如果没有这个,在使用自定义脚本时,行为事件将在java端触发两次。
@Override
public CharSequence getPreconditionScript() {
return "return false;";
}
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(OnDomReadyHeaderItem.forScript(getCallbackScript()));
}
我从一些wicket文档中了解到,组件中包含的任何行为都会阻止其正常行为。当您需要提供自定义行为时,这似乎并不完全正确,因此您需要手动阻止&#34;所有内容&#34;其他
//更新 注意到如果你包括&#34 ;;返回false;&#34;在自定义脚本创建结束时,它将在同一页面上破坏其他一些ajax功能。它可以防止发送您可以从网络流量监控的额外请求,例如用萤火虫,但后来我发现了一个不幸的副作用。