1

我想使用带有 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);

我希望我说清楚了。

提前感谢您的回答,如果我的英语不好,我们深表歉意。

4

1 回答 1

0

我相信要正确使用 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);
    }
});
于 2013-09-09T16:14:53.663 回答