最近,我一直致力于升级使用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");
}
对此有何建议?我希望我提供了足够的信息。 在此先感谢您的帮助。其中一些有点超出我的知识,可能会因为不知道在哪里看而感到恐惧。
答案 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");