Wicket 6.2 AbstractDefaultAjaxBehavior getCallbackUrl不再解析JS变量

时间:2012-11-01 23:58:05

标签: javascript apache callback wicket

最近,我一直致力于升级使用wicket 1.4.18到6.2的大型Web应用程序。我们有一种情况,我们会创建javascript变量来跟踪拖放列表中的定位。这只是代码的wicket方面,因为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");
}

对此有何建议?我希望我提供了足够的信息。 在此先感谢您的帮助。其中一些有点超出我的知识,可能会因为不知道在哪里看而感到恐惧。

3 个答案:

答案 0 :(得分:4)

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");
}

答案 1 :(得分:3)

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

        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;

它将在wicket的dom ready事件中使用回调函数

进行初始化

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

答案 2 :(得分:1)

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");