Wicket 6 - 反馈消息在发生请求后才显示

Wicket 6 - Feedback message not showing until request after the request in which it happened

我有一个 AjaxButton。事件触发,我正在测试一个场景,我需要在不提交更改的情况下添加反馈和 return。我在页面级别添加反馈(我们的反馈仅显示页面级别消息......其他人显示在组件级别反馈面板上)。我将包含反馈面板的 WebMarkupContainer 添加到目标。这完全适用于页面上的所有其他按钮。

但是对于这个按钮,它恰好是唯一一个 defaultformprocessing 不为 false 的按钮,反馈不显示。在用户看来,除了我们的处理面纱出现然后消失之外,什么也没有发生。如果我再次点击提交,则会显示消息和反馈。我在上面贴了一个时间戳,看看它显示的是第二个请求还是第一个请求。从一号开始。

此外,反馈过滤器中的断点显示过滤器从未在第一次请求中调用,但在第二次请求的事件处理之前被调用。它按预期接受消息。

作为测试,我将此按钮上的 defaultformprocessing 设置为 FALSE,事实上,消息突然起作用了。但是,当然,这也意味着表单不会得到处理。谁能帮我解决这个问题?

AjaxButton:

add(new AjaxButton("btnCreateRequest", getForm()) {
        @Override
        public void onSubmit(AjaxRequestTarget target, Form<?> form) {
           //stuff happens
           target.add(getFeedbackPanelForAjax());
           String date = new Date().toGMTString();
           System.out.println("ADDING MESSAGE - " + date);
           getPage().error("This is a message! " + date);
           return;               
        }
        
        @Override
        public void onError(AjaxRequestTarget target, Form<?> form) {
            getPage().error("There was an error processing your request");
            target.add(getFeedbackPanelForAjax());
            target.add(form);
        }
    }.setVisible(enabled));

更新: getFeedbackPanelForAjax returns 反馈所在的网络标记容器。我也试过将反馈直接添加到目标。

public Component getFeedbackPanelForAjax() {
    return (Component) getForm().get("feedbackWmc");
}

反馈添加位置:

    feedback = new FRFeedbackPanel("feedback") {
        @Override
        public boolean isVisible() {
            if(anyMessage()){
                return true;
            } else {
                return false;
            }
        }
    };
    // feedback container
    WebMarkupContainer feedbackWmc = new WebMarkupContainer("feedbackWmc");
    getForm().add(feedbackWmc.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true));
    feedbackWmc.add(feedback.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true));

我可以说通过调试,我在 anyMessage() 中放置了一个断点,在这种情况下它 returns false 同时 getPage().getFeedbackMessages() returns消息正确。我注释掉了 isVisible() 的重写,实际上,消息显示了。问题是,这意味着当没有消息时反馈面板的伪影也会显示,这不是我们想要的。

当我处于 defaultformprocessing=false 的事件中时,这个 anyMessage() 解决方案非常有效。我想我可以做一个 anyMessage() || getPage().getFeedbackMessages(),但我的理解是 anyMessage 应该查找此面板的层次结构中是否有任何消息。不是吗?

我假设您无法在小型快速入门中重现该问题?

一个想法:当 FeedbackPanel 过早收集其消息时,即在您将错误添加到页面之前,我已经看到类似的问题。 FeedbackMessagesModel 保持消息呈现直到请求结束 - 也许您的某些代码通过访问消息模型来触发此操作。