从JavaScript调用Java组件并检索值

时间:2013-05-13 17:09:05

标签: javascript ajax wicket wicket-1.6

我试图从JavaScript调用Wicket组件的方法,并从此方法接收一个值,我想在我用来调用组件的JavaScript函数的剩余部分中使用它。但是,我似乎只能在不等待它产生结果的情况下调用Wicket组件。

更明确地说,我想实现一个AbstractDefaultAjaxBehavior,它允许我在用户离开页面时有条件地警告用户。此条件现在由某种OuterClass.shouldWarn方法确定。但是,即使在下面的示例中调用此方法,我似乎也无法等待此方法的结果以及我无法返回某种结果。相反,JavaScript只是继续执行Java方法调用。

我希望下面的(运行不正确)示例澄清了我的问题:

 class PageExitWarningBehavior extends AbstractDefaultAjaxBehavior {

        @Override
        protected void respond(AjaxRequestTarget target) {
            target.appendJavaScript("return " + 
                (OuterClass.this.shouldWarn() ? "false" : "true"));
        }

        @Override
        public void renderHead(Component component, IHeaderResponse response) {

            String callbackFunktion = String.format(
                    "Wicket.Event.add(window, 'beforeunload', function( e ) {%n"
                          + "if( e ) { e.returnValue = '%s'; }%n"
                          + "var attrs = { 'u': '%s', 'c': '%s', 'ep': { } };%n"
                          + "Wicket.Ajax.get( attrs );%n"
                          + "return false;%n;"
                          + "});",
                    this.getCallbackUrl(),
                    OuterClass.this.getMarkupId());

            response.render(JavaScriptHeaderItem.forScript(callbackFunktion, 
                 "remind-of-running-task"));
        }

    }

1 个答案:

答案 0 :(得分:1)

我相信拦截页面退出事件比实现自己的AjaxBehavior更简单:

尝试实施以下行为:

public class PageExitWarningBehavior extends Behavior {

  private boolean shouldWarn = false;

  @Override
  public void renderHead(Component component, IHeaderResponse response) {
    super.renderHead(component, response);
    if (shouldWarn) {
      response.render(new OnDomReadyHeaderItem("window.onbeforeunload = function (e) {"
    + "var message = 'Your confirmation message goes here.'," 
        + "e = e || window.event;" + "if (e) {"
    + "e.returnValue = message;" + "}" + "return message;" + "};"));
    }
  }

  @Override
  public void onEvent(Component component, IEvent<?> event) {
    super.onEvent(component, event);
    if (event.getPayload() instanceof PageExitWarningEvent) {
      PageExitWarningEvent exitEvent = (PageExitWarningEvent) event.getPayload();
    this.shouldWarn = exitEvent.isPageExitWarningEnabled();
    }
  }
}

在renderHead方法中,您有条件地添加一个简单的javascript,触发浏览器在离开页面时显示确认对话框(javascript代码来自this post)。

在onEvent方法中,我们监听其他一些Wicket组件是否已发送PageExitWarningEvent来通知我们应该显示警告。您可以从任何Wicket组件(例如链接或按钮)发送此类事件,如下所示:

send(HomePage.this, Broadcast.BREADTH, new PageExitWarningEvent(true));

PageExitWarningEvent类如下所示:

public class PageExitWarningEvent {

  private boolean pageExitWarningEnabled = false;

  public PageExitWarningEvent(boolean pageExitWarningEnabled) {
    this.setPageExitWarningEnabled(pageExitWarningEnabled);
  }

  public boolean isPageExitWarningEnabled() {
    return pageExitWarningEnabled;
  }

  public void setPageExitWarningEnabled(boolean pageExitWarningEnabled) {
    this.pageExitWarningEnabled = pageExitWarningEnabled;
  }

}

如果符合您的要求,请告诉我。