【问题标题】:Wicket page is refreshed if use ajax after form is submitted with target=_blank如果在使用 target=_blank 提交表单后使用 ajax,则会刷新 Wicket 页面
【发布时间】:2015-06-03 02:02:29
【问题描述】:

我有一个预览按钮。当用户按下预览时,表单会在新选项卡上提交,以显示 pdf 文件在表单中有数据。 我使用自定义 SubmitLink 来做到这一点 提交资源链接

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> 并刷新页面。 现在,我想在新闻预览后,我仍然正常使用当前表单。 谢谢。

【问题讨论】:

    标签: ajax wicket


    【解决方案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 中打开一个新页面 instance,即它提交表单,但在 onSubmit() 中执行类似于 setResponsePage(getPage().getClass()) 的操作。这样它就不会重新渲染当前页面实例 N+1 次。

    【讨论】:

    • 感谢回答。我明白为什么检票口会这样做。但我不知道如何解决我的问题。
    • 是否可以选择使用弹出窗口?这比打开一个新标签要简单得多。应该是这样的:SubmitLink#setPopupSettings(...)
    猜你喜欢
    • 2012-11-04
    • 2013-09-26
    • 1970-01-01
    • 2013-08-17
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多