【问题标题】:Wicket ListView with AjaxSelfUpdateTimerBehaviourWicket ListView 与 AjaxSelfUpdateTimerBehaviour
【发布时间】:2013-09-09 15:56:37
【问题描述】:

我想使用带有 AjaxSelfUpdatingTimerBehavior 的 ListView。我有一个表单,它需要一个位置和一些文件来使用 MultiFileUploadField 上传。在那之后,我有一个网络服务女巫要存储它们。因此,当我单击提交按钮时,会出现一个模式窗口。它包含我的列表视图。 Web 服务完成后,必须更新此列表。我的问题是当我设置 AjaxSelfUpdatingTimerBehavior 时,当我尝试它时,它会等待new AjaxSelfUpdatingTimerBehavior 中提到的秒数,然后列表消失。我试过这个

[1]: https://cwiki.apache.org/confluence/display/WICKET/How+to+repaint+a+ListView+via+Ajax 但徒劳无功。我使用 Wicket 6.8.0。

这是标记

<div class="modal-body" style="display: table-cell;">

    <table wicket:id="wholeTable">      
        <tr wicket:id="files">
            <td width="30"><span wicket:id="ajaxSpinner"><img
                    src="../img/ajax-loader.gif" /></span><span
                wicket:id="orderValid"><img
                    src="../img/ok-16.png" /></span><span
                wicket:id="orderFailed"><img
                    src="../img/ok-16.png" /></span></td>
            <td wicket:id="container" style="opacity:0.4"><span wicket:id="putMessage"></span></td>
        </tr>
    </table>
</div>

这是Java代码

WebMarkupContainer wholeTable = new WebMarkupContainer("wholeTable");

    IModel<ArrayList<FileUpload>> inputFilesModel = new LoadableDetachableModel<ArrayList<FileUpload>>() {

        @Override
        protected ArrayList<FileUpload> load() {
            return (ArrayList<FileUpload>) inputFiles;
        }

    };
    ListView<FileUpload> fileList = new ListView<FileUpload>("files", inputFilesModel) {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        @Override
        protected void populateItem(final ListItem<FileUpload> item) {
            final FileUpload file = (FileUpload) item.getModelObject();
            WebMarkupContainer container = new WebMarkupContainer("container");
            item.add(container);
            item.add(new WebMarkupContainer("ajaxSpinner"));
            item.add(new WebMarkupContainer("orderValid"));
            item.add(new WebMarkupContainer("orderFailed"));
            item.get("orderValid").setVisible(false);
            item.get("orderFailed").setVisible(false);
            container.add(new Label("putMessage", "dépôt de l'archive " + file.getClientFileName()));
        }
    };
    wholeTable.setOutputMarkupId(true);
    // Update the whole panel every two second
    wholeTable.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(1)));
    wholeTable.add(fileList);
    target.add(wholeTable);
    add(wholeTable);

我希望我说清楚了。

提前感谢您的回答,如果我的英语不好,请见谅。

【问题讨论】:

  • 第二次加载'inputFiles'这个列表是空的不是问题吗?导致表格呈现空列表,即不呈现任何项目。
  • 我没想到。我该怎么做才能让它第二次不加载或让它第二次加载非空的东西?谢谢
  • 这取决于inputFiles 的填充方式。你能显示该列表周围的代码吗?
  • inputFiles 在构造函数中作为参数填充。我将在星期一显示代码,我现在无法访问它。

标签: java ajax listview wicket


【解决方案1】:

我相信要正确使用 AjaxSelfUpdatingTimerBehavior,您应该重写 'onTimer(AjaxRequestTarget)' 方法并将您想要刷新的元素(在您的情况下 - WholeTable)添加到它的 AjaxRequestTarget。

编辑:

换行:

wholeTable.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(1)));

收件人:

wholeTable.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(1)) {
    @Override
    protected void onTimer(AjaxRequestTarget target) {
       target.add(wholeTable);
    }
});

【讨论】:

  • 我不知道该怎么做。我尝试扩展 AjaxSelfUpdatingTimerBehavior 但我无法覆盖 onTimer 方法,因为我使用的是 wicket 6.8.0 并且就像这里所说的 doc 一样,该方法是最终的。那么我该如何覆盖它,您能否更具体地了解被覆盖方法的内容。谢谢
  • 检查我的编辑。在文档中,您链接的“onTimer()”方法被标记为受保护而不是最终的。
  • 再次感谢您的回答,但就像我说的那样,这是最终结果。请在文档中查看我链接了 onTimer() 方法的详细信息,你会发现它是最终的。但我还扩展了 AbstractAjaxTimerBehavior 类并将 [AjaxSelfUpdateTimerBehaviour.java] (grepcode.com/file/repo1.maven.org/maven2/org.apache.wicket/…) 放入其中,并将您指定的行添加到 onTimer() 方法中。
猜你喜欢
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
相关资源
最近更新 更多