从Wicket调用Javascript函数

dre*_*ute 3 java wicket

我想将html中javascript代码块的输出传递给相应的wicket组件.我尝试过AbstractDefaultAjaxBehaviour,它似乎不起作用.

这是我正在使用的:

HTML

// In <body>
<div wicket:id="container">
<script type="text/javascript" wicket:id="channelScript">

  function initChannel() {
    window.alert('got it');
  }

</script>
</div>

private WebMarkupContainer container = new WebMarkupContainer("container");
private Label channelScript = new Label("channelScript", "initChannel();");

add(container);
final AbstractDefaultAjaxBehavior channel = new AbstractDefaultAjaxBehavior() {
    protected void respond(final AjaxRequestTarget target) {
    channelScript.setEscapeModelStrings(false);
        target.add(channelScript); // initChannel is not triggerred
    }
};
container.add(channel);
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

add(new AjaxEventBehavior("onload") {
  @Override
  protected void onEvent(AjaxRequestTarget target) {
    channelScript.setEscapeModelStrings(false);
    target.add(new Label(channelScript));
  }
}
Run Code Online (Sandbox Code Playgroud)

请问我做错了什么?谢谢

UPDATE

我将把一系列变量从wicket传递给JS,这样每个javascript输出都会使用wicket组件显示.我刚刚意识到我将不得不用dom ready状态来开始交互.所以没关系.但是后来我仍然对Wicket组件如何改变状态以接收来自javascript的更新响应感到困惑和无能为力.是否有一个wicket组件异步触发自身?

Til*_*ill 5

不要将Label用作脚本容器.Wicket有一些适当的方法来做到这一点.以下代码将在选项上(假设您在wicket 1.5上)

    @Override
public void renderHead(final Component component, final IHeaderResponse response)
{
    super.renderHead(component, response);

    response.renderJavaScript("initChannel();", "myScriptID");
}
Run Code Online (Sandbox Code Playgroud)

如果要在站点完全加载后执行脚本,可以使用以下命令:

response.renderOnLoadJavaScript("doSomething();");
Run Code Online (Sandbox Code Playgroud)

在wicket 1.4中,这种方式有所不同.你必须在那里使用HeaderContributors.