用指示 AjaxButton 替换提交链接

replacing a submitlink with indicatingAjaxButton

我有一个带有提交按钮的表单,它将从数据库中获取结果并根据这些结果更新列表视图。如果没有结果,将显示一条反馈消息。这一切都很好。

现在我想用 IndicatingAjaxButton 替换提交链接,这样用户可以在获取结果需要很长时间时看到发生的事情。

基本思路是这样的:

IndicatingAjaxButton submitLink = new IndicatingAjaxButton("submit", form) {

        private static final long serialVersionUID = -4306011625084297054L;

        @Override
        public void onSubmit(AjaxRequestTarget target, Form<?> form) {
            Integer hourFrom = 0;
            Integer hourTo = 0;
            Integer minuteFrom = 0;
            Integer minuteTo = 0;
            hourFrom = Integer.parseInt(hour_from.getModelObject());
            hourTo = Integer.parseInt(hour_to.getModelObject());

            minuteFrom = Integer.parseInt(minute_from.getModelObject());
            minuteTo = Integer.parseInt(minute_to.getModelObject());

            Calendar from = Calendar.getInstance();
            Calendar to = Calendar.getInstance();

            Date dateFrom = date_from.getModelObject();
            Date dateTo = date_to.getModelObject();

            from.setTime(dateFrom);
            to.setTime(dateTo);

            from.set(Calendar.HOUR, hourFrom);
            from.set(Calendar.MINUTE, minuteFrom);

            to.set(Calendar.HOUR, hourTo);
            to.set(Calendar.MINUTE, minuteTo);

            if (topicQueueSelect.getModelObject() == null) {
                error("Please select a message name.");
                getSession().setAttribute("error", "");
            }

            if (to.before(from)) {
                error("Date to must be after date from.");
                getSession().setAttribute("error", "");
            }

            cal.setTimeInMillis(System.currentTimeMillis());

            if (from.after(cal)) {
                error("Date from must be in the past.");
                getSession().setAttribute("error", "");
            }

            if (getSession().getAttribute("error") != null) {
                getSession().removeAttribute("error");
                return;
            }

            page.setModelObject(1);
            List<Search> searchFields = (List<Search>) searchFieldsField
                    .getModelObject();
            messageKeyDataList = messageController.search(
                    topicQueueSelect.getModelObject(), searchFields,
                    from.getTime(), to.getTime(),
                    maxResults.getModelObject(), page.getModelObject(),
                    sortorder);
            if (messageKeyDataList.size() == 0) {
                info("Search criteria didn't produce any results.");
                result.setList(messageKeyDataList);
                resultContainer.setVisible(false);
                return;
            }
            resultContainer.setVisible(true);
            resultSize = messageController.getResultSize();
            int pages = (int) Math.ceil((float) resultSize
                    / maxResults.getModelObject());
            ArrayList<Integer> pageNumbers = new ArrayList<Integer>();
            for (int n = 1; n <= pages; n++) {
                pageNumbers.add(n);
            }
            page.setChoices(pageNumbers);
            pageunder.setChoices(pageNumbers);
            showing.setDefaultModelObject("Showing 1 to "
                    + messageKeyDataList.size() + " out of " + resultSize
                    + " messages");

            lastSearch.put("topicQueue", topicQueueSelect.getModelObject());
            lastSearch.put("searchFields", searchFields);
            lastSearch.put("from", from.getTime());
            lastSearch.put("to", to.getTime());
            lastSearch.put("maxResults", maxResults.getModelObject());
            result.setList(messageKeyDataList);
            target.add(feedback);
        }
    };

SubmitLink 确实向我显示了带有新列表的 ResultView 或信息消息,而 IndicatingAjaxButton 则没有。我知道调用了表单提交,因为正在打印 system.out。

对此有什么建议吗?

SubmitLink 是非 Ajax 组件。使用它会重绘整个页面! IndicatingAjaxButton 是一个 Ajax 组件。您需要使用传递的 AjaxRequestTarget 来添加应使用 Ajax 响应重新绘制的组件。例如,应将 FeedbackPanel 添加到 AjaxRequestTarget。

我发现我必须对 resultContainer 和反馈执行 setOutputMarkupPlaceholderTag(true)。之后将它们添加到 requesttarget 会按预期工作。