【问题标题】:How to get wicket's FeedbackMessages count如何获得检票口反馈消息计数
【发布时间】:2014-02-27 06:37:36
【问题描述】:

我正在实现 AjaxRequestTarget.IListener。因此,如果有任何消息,我的应用程序会自动更新 FeedbackPanel。我想检查我的代码是否有任何消息:

        getAjaxRequestTargetListeners().add(new AjaxRequestTarget.IListener() {

        @Override
        public void onBeforeRespond(Map<String, Component> map,
                final AjaxRequestTarget target) {

            WebSession.get().getFeedbackMessages(); // Doesnt work
            target.getPage().getSession().getFeedbackMessages(); // Doesnt work
            target.getPage().visitChildren(IFeedback.class, new IVisitor<Component, Void>() {

                @Override
                public void component(Component component, IVisit<Void> visit) {
                    if (component.isVisibleInHierarchy()) {
                        target.add(component);
                    }
                }
            });
        }

        @Override
        public void onAfterRespond(Map<String, Component> map, AjaxRequestTarget.IJavaScriptResponse response) {
        }
    });

【问题讨论】:

    标签: java session wicket


    【解决方案1】:

    试试这个:

    target.getPage().visitChildren(FeedbackPanel.class, new IVisitor<FeedbackPanel, Void>() {
        @Override
        public void component(FeedbackPanel component, IVisit<Void> visit) {
            if (component.isVisibleInHierarchy() && component.anyMessage()) {
                target.add(component);
            }
        }
    });
    

    component.getFeedbackMessages() 只返回添加到该组件的消息。它不考虑添加到其他组件的消息或会话消息(即Session.get().error(...)

    这是我个人使用的,而不是请求监听器:

    public class CustomFeedbackPanel extends FencedFeedbackPanel {
    
        [...]
    
        @Override
        public void onEvent(IEvent<?> event) {
            // Always re-render the feedback panel input during ajax requests if it contains messages
            if (event.getPayload() instanceof AjaxRequestTarget && anyMessage()) {
                ((AjaxRequestTarget) event.getPayload()).add(this);
            }
        }
    }
    

    但请注意,将反馈面板添加到 ajax 请求将删除客户端上先前显示的反馈消息。

    编辑

    我意识到我没有回答问题标题中提出的问题,但找到了所描述问题的另一种解决方案。

    因此,要获取消息计数,有以下受保护的方法: List&lt;FeedbackMessage&gt; FeedbackPanel#getCurrentMessages()

    【讨论】:

    • 看起来不错,我会试试这个。谢谢:)
    【解决方案2】:

    如果您使用 Wicket 6,反馈消息的存储已从 Session 更改为组件:https://cwiki.apache.org/confluence/display/WICKET/Migration+to+Wicket+6.0#MigrationtoWicket6.0-FeedbackStorageRefactoring

    因此,如果您使用 Wicket 6,您可以检查 IVisitor 中的反馈消息数量,其中组件应实现 IFeedback,该方法有一个方法 getCurrentMessages(),该方法返回特定 @ 的反馈消息 List 987654327@组件

    【讨论】:

    • 是的,我使用的是 Wicket 6。所以如果我理解正确,我应该检查component.getFeedbackMessages(),但这个也返回空列表
    • 那么你确定你有反馈信息吗?
    • 是的,它显示了,我只是想检查是否有,没有必要总是将反馈面板添加到目标
    【解决方案3】:

    在您的基本 Web 应用程序 init() 方法中,添加一个 ajax 侦听器会有所帮助:

    protected void init() {  
    super.init();  
    //...  
    this.getAjaxRequestTargetListeners().add(new AjaxRequestTarget.IListener() {   
    public void onBeforeRespond(Map map, final AjaxRequestTarget target) {   
    // DO THIS
     target.getPage().visitChildren(FeedbackPanel.class,
      new IVisitor<FeedbackPanel, Void>() {
        public void component(FeedbackPanel component, IVisit<Void> visit) {
            if (component.isVisibleInHierarchy() && component.anyMessage()) {
                target.add(component);
    
            }
                        visit.dontGoDeeper();
            }
        });
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2016-03-12
      • 1970-01-01
      相关资源
      最近更新 更多