【问题标题】:Wicket 6.2 AbstractDefaultAjaxBehavior getCallbackUrl no longer resolves JS variablesWicket 6.2 AbstractDefaultAjaxBehavior getCallbackUrl 不再解析 JS 变量
【发布时间】:2012-11-01 23:58:04
【问题描述】:

最近我一直致力于将使用 wicket 1.4.18 的大型 Web 应用程序升级到 6.2。我们有一种情况,我们会创建 javascript 变量来跟踪拖放列表中的位置。这只是代码的检票口部分,因为 js 一直有效并且没有更改。

ListItem.add(new AbstractDefaultAjaxBehavior()
{
    private static final long serialVersionUID = 1L;

    @Override
    public void onComponentTag(ComponentTag tag)
    {
        tag.put("ondrop", "var value = $(ui.item[0]).attr('hiddenvalue');"
            + this.getCallbackScript());
    }


    @Override
    public final CharSequence getCallbackUrl()
    {
        return super.getCallbackUrl() + "&hiddenvalue' + value + '";
    }
}

但是我遇到的问题是 javascript 变量没有解析为值,现在在 getCallbackUrl 中被视为文字字符串(例如:'value' 而不是 5)。这不是 wicket 1.4.18 的情况,我不认为这个问题源于我们迁移到 1.5.8。

最后我们只是希望能够使用

@Override
protected void respond(AjaxRequestTarget target)
{
    getRequest().getRequestParameters().getParameterValue("hiddenvalue");
}

对此有何建议?我希望我已经提供了足够的信息。 提前感谢您的帮助。其中一些超出了我的知识范围,可能会令人生畏,不知道在哪里看。

【问题讨论】:

    标签: javascript apache callback wicket


    【解决方案1】:

    Wicket Ajax 已针对 Wicket 6 完全重写。有关详细说明,请参阅 this page

    在你的情况下,你应该像这样使用新的AjaxRequestAttributes

    @Override
    protected void updateAjaxAttributes(final AjaxRequestAttributes attributes) {
        super.updateAjaxAttributes(attributes);
        attributes.getExtraParameters().put("hiddenvalue", "value");
    }
    

    从请求中检索值仍然和以前一样。

    @Override
    protected void respond(AjaxRequestTarget target)
    {
        getRequest().getRequestParameters().getParameterValue("hiddenvalue");
    }
    

    【讨论】:

    • 当你使用 attributes.getExtraParameters().put("hiddenvalue", "value");我仍然得到字符串“value”而不是js解析 $(ui.item[0]).attr('hiddenvalue');价值。
    • 那么你应该看看 AjaxRequestAttributes.getDynamicExtraParameters()。这些可以通过在客户端评估的任意 JS 函数和表达式。
    • 抱歉来晚了,但 AjaxRequestAttributes.getDynamicExtraParameters() 确实为我工作
    【解决方案2】:

    另一种更简洁的方法是使用回调函数

            AbstractDefaultAjaxBehavior ajaxBehavior = new AbstractDefaultAjaxBehavior() {
    
            @Override
            protected void respond(AjaxRequestTarget target) {
                String param1Value = getRequest().getRequestParameters().getParameterValue(AJAX_PARAM1_NAME).toString();
                String param2Value = getRequest().getRequestParameters().getParameterValue(AJAX_PARAM2_NAME).toString();
                System.out.println("Param 1:" + param1Value + "Param 2:" + param2Value);
            }
    
            @Override
            public void renderHead(Component component, IHeaderResponse response) {
                super.renderHead(component, response);
                String callBackScript = getCallbackFunction(CallbackParameter.explicit(AJAX_PARAM1_NAME), CallbackParameter.explicit(AJAX_PARAM2_NAME)).toString();
                callBackScript = "sendToServer="+callBackScript+";";
                response.render(OnDomReadyHeaderItem.forScript(callBackScript));
            }
    
        };
        add(ajaxBehavior);
    

    在你的 javascript 中为函数定义一个变量 var sendToServer;

    它会在 dom ready 事件上被 wicket 用回调函数初始化

    从 javascript 调用 sendToServer(x,y) 将参数传递给服务器。

    【讨论】:

      【解决方案3】:
      private static final String MY_PARAM = "myparam";
      public static class SampleCallbackBehavior extends AbstractDefaultAjaxBehavior {        
          @Override
          public void renderHead(Component component, IHeaderResponse response) {
              super.renderHead(component, response);
              response.render(OnDomReadyHeaderItem.forScript("var myfunction : " + getCallbackFunction(CallbackParameter.explicit(MY_PARAM))));
          }
          @Override
          protected void respond(AjaxRequestTarget target) {
              StringValue paramValue = getComponent().getRequest().getRequestParameters().getParameterValue(MY_PARAM);
              //TODO handle callback
          }       
      }
      

      在此之后,您应该只从 javascript 调用该函数

      myfunction("paramValue");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-29
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多