我有一个带有多个面板的 Wicket 页面,允许用户在弹出窗口中打开一个新的 Wicket 页面。用户可以输入一些数据,在弹出窗口中点击提交,提交完成后关闭。
如何在父页面中获得弹出窗口已关闭的回调,以便我可以刷新父页面(父页面需要反映用户在弹出窗口中输入的数据)?
是否可以在负责弹出窗口打开的父页面的面板中接收回调,以便我只能刷新面板本身而不是整个页面(这也需要获取 AjaxRequestTarget)?
1)您需要在父页面中定义模态窗口以及您需要在其中打开它的维度。
2)使用setWindowClosedCallback(ModalWindow.WindowClosedCallback)
(在父页面中)方法并在此方法中声明您想要在模式关闭后使用的代码段。请参阅此以获取更多信息文档
希望能帮助到你。
我遇到了同样的问题,我使用 javascript 重新加载父页面来解决它。我不知道使用 wicket 是否有更好的解决方案。但这是我的:
在弹出的 java 文件中:
//...
Form<Void> form = new Form<Void>("form") {
boolean close = false; // it says when the user has closed the window
@Override protected void onSubmit() {
//...
close = true;
}
@Override public void renderHead(IHeaderResponse response) {
super.renderHead(response);
if(close) {
// This javascript will close the file
response.renderJavaScriptReference("js/close.js");
}
}
};
popup.js:
var _close = true;
在弹出窗口的 HTML 中:
<script type="text/javascript">
// if the var user is set and true it will reload the opener page and close itself
function reload() {
if(typeof _close != 'undefined' && _close) {
window.opener.location.reload();
self.close();
}
}
</script>
解决方案相当混乱(即使是 JS,它也是高度可改进的),但它可以工作:P 例如,现在我将使用 JQuery,我将我的 reload 函数附在里面$(document).ready(function() {...})
;而且我认为没有理由不将所有 JS 放入文件(close.js)中,而不是将其拆分为 HTML 和一个单独的文件。
查看 WicketStuff 中的 ModalX 项目。它为所有模式的事物内置了“现成的”管道,包括一个非常简单的 IWindowCloseListener 接口,您只需将其传递到您的 ModalX 模式实例中,它就会安排正确的回调,在表单为时提供模式实例和 AjaxRequestTarget关闭。