将提交链接替换为指示AjaxButton



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

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

基本思想是这样的:

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确实向我显示了带有新列表的结果视图,或者指示AjaxButton没有的信息消息。我知道表单提交被调用,因为正在打印 system.out。

对此有什么建议吗?

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

我发现我必须在resultContainer和反馈上执行setOutputMarkupPlaceholderTag(true)。之后,将它们添加到请求目标按预期工作。

最新更新