我试图从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"));
}
}
答案 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;
}
}
如果符合您的要求,请告诉我。