将Wicket中的字符串传递给JavaScript

时间:2013-11-12 17:07:34

标签: ajax wicket

对于一个新项目,我们使用一个复杂的外部JavaScript库,需要一些参数进行初始化。此参数值仅在运行时已知,因此我们希望构建某种AJAX机制,以便JavaScript在需要时加载参数。

我尝试通过以下机制实现这一目标:

PageThatContainsTheJavaScript.java

public GraphPanel(String id) {
  add(new AbstractDefaultAjaxBehavior() {
    protected void respond(final AjaxRequestTarget target) {
        final RequestCycle requestCycle = RequestCycle.get();           
        TextRequestHandler textRequestHandler = new TextRequestHandler("text/plain", "UTF-8", content.toString()); //content - the parameter value
        requestCycle.scheduleRequestHandlerAfterCurrent(textRequestHandler);
    }
  });
  add(new Label("ajaxtest", ""));
}
@Override
protected void onBeforeRender() {
  super.onBeforeRender();
  String callbackUrl = behave.getCallbackUrl().toString();
  String callbackFunction = String.format("Wicket.Ajax.get({'u':'%s'});",callbackUrl);
  replace(new Label("ajaxtest", callbackFunction));
}

标签“ajaxtest”只是一种方便地访问生成的回调网址以进行测试的方法。

PageThatContainsTheJavaScript.html

function externalApplicationStart() {
  var parameter = Wicket.Ajax.get({'u':"'"+document.getElementById('ajaxtest').innerHTML+"'"});
  var application = new demo.yfiles.layout.modules.LayoutModulesDemo(parameter);
  // arbitrary init code
  application.start();
});

我没有找到关于这个问题的非常好的教程,所以有可能,这次尝试有问题​​,虽然我猜这总体方向是正确的。

我的问题是,只要存在Wicket.ajax.get行,JavaScript函数就会挂起。当我对该行进行注释并传递硬编码的默认参数时,应用程序将启动。 我做错了什么,如何从Wicket获取String参数到JavaScript函数?

我发现一个功能性解决方案是将参数值作为隐藏HTML标记的内容(如<span id='...' style='display:none;'>parameterValue</span>)传递,但将来可能需要将更长的值传递给JavaScript(如XML内容)并且我不想将生成的HTML与所有那些非内容值混淆。

//编辑:生成的ajaxtest-HTML-Tag如下所示:

<span wicket:id="ajaxtest" id="ajaxtest">
  Wicket.Ajax.get({'u':'./.?0-1.IBehaviorListener.0-graphContainer-graphControl'});
</span>

尝试在控制台中执行Wicket.Ajax.get({'u':'./.?0-1.IBehaviorListener.0-graphContainer-graphControl'});只会产生undefined

此外,我不确定网址中的第二个点来自哪个(./.?0 ...),但尝试使用./?0 ...会产生相同的结果。

2 个答案:

答案 0 :(得分:2)

在你的GraphPanel我会覆盖renderHead()并在那里初始化你的参数,alson就像这样启动你的JS组件:

@Override
public void renderHead(IHeaderResponse response) {
    super.renderHead(response); 
    response.render(OnDomReadyHeaderItem.forScript("var parameter = 'aaa';"));
    response.render(OnDomReadyHeaderItem.forScript("externalApplicationStart();"));
}

我脑海中的一个完整解决方案是renderHead还会加载你的js lib和一个包含控制你的js lib的函数的js文件。像这样:

@Override
public void renderHead(IHeaderResponse response) {
    super.renderHead(response); 
    response.render(OnDomReadyHeaderItem.forScript("var parameter = 'aaa';"));
    response.render(JavaScriptReferenceHeaderItem.forReference(yourJsLibResourceReference));
    response.render(JavaScriptReferenceHeaderItem.forReference(yourJsToControlTheJsLib));
    response.render(OnDomReadyHeaderItem.forScript("externalApplicationStart();"));
}

答案 1 :(得分:0)

您可以将自定义javascript事件添加到HTML元素中,然后通过触发器查看http://www.w3schools.com/jquery/event_trigger.asp或使用jQuery从您的javascript调用它。