如果在使用target = _blank提交表单后使用ajax,则会刷新Wicket页面

lua*_*nvu 5 ajax wicket

我有一个预览按钮.当用户按下预览时,表单将在新选项卡上提交,以显示pdf文件中包含数据的形式.我使用自定义SubmitLink来执行 SubmitResourceLink

public abstract class SubmitResourceLink extends SubmitLink implements IResourceListener {
private final IResource resource;

@Override
public final void onResourceRequested() {
    Attributes a = new Attributes(RequestCycle.get().getRequest(), RequestCycle.get().getResponse(), null);
    resource.respond(a);
}
Run Code Online (Sandbox Code Playgroud)

在表格上实施

new SubmitResourceLink("previewBtn", form, new JasperReportsResource() {
        private static final long serialVersionUID = -2596569027102924489L;

        @Override
        public byte[] getData(Attributes attributes) {
            return control.getExportPreviewByteStream(estimateModel.getObject());
        }
    }) {
        private static final long serialVersionUID = 1L;

        @Override
        protected String getTriggerJavaScript() {
            String js = super.getTriggerJavaScript();
            js = "document.getElementById('" + form.getMarkupId() + "').target='_blank';" + js;
            return js;
        }

        @Override
        public void onSubmit() {
            form.add(AttributeModifier.append("target", Model.of("_blank")));
            processInputs(form);
            onResourceRequested();
        }
    }.setDefaultFormProcessing(false);
Run Code Online (Sandbox Code Playgroud)

当我按下预览时,会打开一个新选项卡.但是当我输入任何ajax组件(例如:AutoCompleteTextField)时,ajax响应数据xml:<ajax-response><redirect>....</redirect></ajax-response>和刷新页面.现在,我希望在按下预览后,我仍然使用当前形式的规范.谢谢.

mar*_*n-g 1

这是由 Wicket 中的“陈旧页面保护”引起的。第一次单击会在新选项卡/窗口中打开同一页面实例。这会增加页面的renderCount计数器,即它表示“此页面已被渲染 N 次”。
Wicket 中的链接看起来像?2-1.ILinkListener-component~path。这里“2”是页面 ID,“1”是页面渲染计数。因此 tab1 中的链接的 renderCount 为“N”,tab2 中的链接为“N+1”。
单击 tab1 中的链接将失败,并出现 StalePageException,该异常告诉 Wicket“用户正在尝试使用该页面的过时版本。请呈现该页面的最新版本,以便用户可以重试”。

需要这种保护是因为用户可能在 tab3 中执行许多操作,例如替换面板,该面板替换/隐藏用户想要在 tab1 中单击的链接。如果没有这样的保护,Wicket 在尝试单击链接时将失败并出现 ComponentNotFoundException,或者更糟糕的是,如果链接/按钮位于中继器中并且中继器已更改其在 tab2 中的项目,则更糟糕的是可能会执行错误的操作。

为了解决您的问题,您应该在 tab2 中打开一个新页面实例,即它提交表单,但onSubmit()会执行类似setResponsePage(getPage().getClass()). 这样就不会重新渲染当前页面实例 N+1 次。