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

时间:2014-02-18 12:49:38

标签: javascript wicket

我想从浏览器向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请求:

  1. localhost:8080 / cyclop / cyclop / ced?2 - 这个返回整页
  2. localhost:15111 / cyclop / cyclop / ced?2-11.IBehaviorListener.0-historyPanel - 这一个ajax响应
  3. 以下是代码:

    包含触发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()));
    }
    

3 个答案:

答案 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组件上的其他/不需要的行为的解决方案如下:

  1. 覆盖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()));
    }
    
  2. 我从一些wicket文档中了解到,组件中包含的任何行为都会阻止其正常行为。当您需要提供自定义行为时,这似乎并不完全正确,因此您需要手动阻止&#34;所有内容&#34;其他

    //更新 注意到如果你包括&#34 ;;返回false;&#34;在自定义脚本创建结束时,它将在同一页面上破坏其他一些ajax功能。它可以防止发送您可以从网络流量监控的额外请求,例如用萤火虫,但后来我发现了一个不幸的副作用。