3

我有一个附加了 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 调用。

我真的很感激任何帮助。

4

3 回答 3

2

基本上,您应该在自定义中使用updateAjaxAttributes()andrenderHead()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));
}

}
于 2013-10-24T09:04:17.263 回答
0

我认为您需要将响应的内容绑定到全局 Javascript 变量 ( window.MyObject.saveAmount = function(){...})。

这样你就可以从你自己的 Javascript 中调用它。在我看来,问题在于 Wicket 将其 Ajax 响应的内容“沙箱化”到一个小范围(响应范围)。

如果我的回答无效,请提供更完整的示例。

于 2013-04-03T14:43:15.943 回答
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");
于 2014-03-13T16:23:52.693 回答