【问题标题】:Wicket retrieve javascript variable to use in javaWicket 检索要在 java 中使用的 javascript 变量
【发布时间】:2013-08-24 13:12:19
【问题描述】:

我正在尝试使用 Java 检索 javascript 变量。我认为我接近解决方案。

我想检索面板上元素的宽度。为此,我在面板中添加了一个行为,该行为添加了回调并检索参数(宽度和高度)。

private class ImageBehavior extends AbstractDefaultAjaxBehavior {

    @Override
    protected void respond(AjaxRequestTarget target) {
        //I receive a JavaScript call :)
        StringValue width  = getRequest().getRequestParameters().getParameterValue("width");
        StringValue height = getRequest().getRequestParameters().getParameterValue("height");       
    }

    @Override
    protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
        super.updateAjaxAttributes(attributes);
        attributes.getExtraParameters().put("width", "undef");
        attributes.getExtraParameters().put("height", "undef");
    }

    @Override
    public void renderHead(Component component, IHeaderResponse response) {
        super.renderHead(component, response);
        response.render(OnDomReadyHeaderItem.forScript(getCallbackScript().toString()));

    }
}

在 javascript 中,会调用以下代码:

function callbackWicketNewImage(element) {
    var wcall = Wicket.Ajax.get({ 'u': 'callbackUrl', 'ep' : {'width': element.width(), 'height': element.height()}});
}

调用 js-code 时,会调用 'respond' 方法,但 width 和 height 参数的值没有改变。他们仍然“未定义”。

【问题讨论】:

  • 也许 element.width() 和 element.height() 返回 undef?你真的是在 JS 中更新页面上的这些值吗?
  • 很遗憾没有。 element.width 和 element.height 方法确实返回正确的值。

标签: javascript ajax parameters callback wicket


【解决方案1】:

我用下面的代码解决了我的问题。请注意,抽象的 onResponse 方法是用于抽象目的。

public abstract class SizeBehavior extends AbstractDefaultAjaxBehavior {

@Override
protected void respond(AjaxRequestTarget target) {
    IRequestParameters request = RequestCycle.get().getRequest().getRequestParameters();
    onResponse(request.getParameterValue("widthParam").toDouble(),
            request.getParameterValue("heightParam").toDouble());
}

@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
    super.updateAjaxAttributes(attributes);
    attributes.getDynamicExtraParameters()
    .add("return {'widthParam': $(" + getComponent().getMarkupId() + ").width(), " +
                 "'heightParam': $(" + getComponent().getMarkupId() + ").height()}");
}

public void renderHead(Component component, IHeaderResponse response) {
    response.render(OnLoadHeaderItem.forScript(getCallbackScript().toString()));
}

public abstract void onResponse(double width, double height);
}  

行为调用:

add(new SizeBehavior() {
    @Override
    public void onResponse(double width, double height) {
        //set vars..
        widthVar = width;
        heightVar = height;
    }
});

【讨论】:

    【解决方案2】:

    您的response 方法应如下所示:

    @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
      }
    

    您使用getRequestParameters()。应该是getQueryParameters()

    编辑:另见这篇文章:http://thombergs.wordpress.com/2013/01/07/rolling-your-own-ajax-behavior-with-wicket

    【讨论】:

    • 不幸的是,这并没有改变任何东西。
    猜你喜欢
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2014-12-02
    相关资源
    最近更新 更多