我有一个附加了JavaScript文件的页面。
JavaScript有一个函数,最后应调用Wicket通过AbstractDefaultAjaxBehavior注入的函数。
JavaScript看起来像这样:
function updateAmount(amount){
// do some calculations on amount
saveAmount(amount);
}
注入的函数应如下所示:
function saveAmount(amount){
Wicket.Ajax.post({
u: '${callbackUrl}',
dep: function(){
return [{name:'amount','value':amount}];
}
}
我遇到的问题是当updateAmount
调用saveAmount
函数时,(控制台)日志声明“saveAmount”未定义。
如果我查看源代码,注入的函数就在那里,但不是JavaScript,而是由wicket生成的“AJAX”JavaScript。
目标是在JavaScript中调用一个函数,该函数将调用由Wicket注入的函数,该函数使用JavaScript提供的参数执行AJAX调用。
我真的很感激任何帮助。
答案 0 :(得分:2)
基本上,您应该在自定义updateAjaxAttributes()
renderHead()
和AbstractAjaxBehaviour
有关详细信息,请参阅:
<击> http://wickedsource.org/2013/01/07/rolling-your-own-ajax-behavior-with-wicket/ 击>
取自Google缓存,相关代码(由Tom Hombergs撰写):
public class MyAjaxBehavior extends AbstractDefaultAjaxBehavior {
@Override
protected void respond(AjaxRequestTarget target) {
RequestCycle cycle = RequestCycle.get();
WebRequest webRequest = (WebRequest) cycle.getRequest();
StringValue param1 = webRequest.getQueryParameters().getParameterValue("param1");
StringValue param2 = webRequest.getQueryParameters().getParameterValue("param2");
// do whatever you need with param1 and param2
}
@Override
public CharSequence getCallbackScript() {
String script = super.getCallbackScript().toString();
script = script.replace("\"PLACEHOLDER1\"", "param1Value");
script = script.replace("\"PLACEHOLDER2\"", "param2Value");
return script;
}
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
super.updateAjaxAttributes(attributes);
attributes.getExtraParameters().put("param1", "PLACEHOLDER1");
attributes.getExtraParameters().put("param2", "PLACEHOLDER2");
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
String script = "var param1Value = My.JavaScript.Module.calculate1();";
script += "var param2Value = My.JavaScript.Module.calculate2();";
script += getCallbackScript();
response.render(OnDomReadyHeaderItem.forScript(script));
}
}
答案 1 :(得分:0)
我认为您需要将响应内容绑定到全局Javascript变量(window.MyObject.saveAmount = function(){...}
)。
这样您就可以从自己的Javascript中调用它。在我看来,问题是Wicket将其Ajax响应的内容“沙箱化”到一个小范围(响应一)。
如果我的回答无效,请提供更完整的示例。
答案 2 :(得分:0)
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");