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

时间:2015-06-03 02:02:29

标签: 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);
}

在表单上实施

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);

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

1 个答案:

答案 0 :(得分:1)

这是由过时页面保护引起的&#34;在Wicket。 第一次单击会在新选项卡/窗口中打开同一页面实例。这会增加页面的renderCount计数器,即它显示&#34;此页面已呈现N次&#34;。
Wicket中的链接看起来像?2-1.ILinkListener-component~path。这里&#39; 2&#39;是页面ID和&#39; 1&#39;是页面渲染计数。 因此,tab1中的链接具有renderCount&#39; N&#39;以及tab2中的链接 - &#39; N + 1&#39;。
单击tab1中的链接将失败,StalePageException告诉Wicket&#34;用户正在尝试使用过时的页面版本。请渲染最新版本的页面,以便用户再次尝试&#34;。

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

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