Java Wicket AJAX обновляет представление данных с разбивкой по страницам - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть страница со списком объектов Hibernate, которая загружается динамически при отображении страницы.Список используется для создания DataView, который используется для отображения разбитого на страницы списка записей в списке в контейнере.Каждая запись в списке имеет значок удаления.Когда нажата иконка удаления, я лениво удаляю запись, перезагружаю список с сущностями (которые больше не будут содержать ленивую удаленную запись) и перезагружаю контейнер, но запись все еще там в контейнере, пока я не перезагрузлю всю страницу,Почему?

public class LogPage extends ProjectPage{

    @SpringBean
    private LogDao logDao;
    @SpringBean
    private LogEntryDao logEntryDao;

    private List<LogEntry> logEntryList;
    private DataView<LogEntry> dataView;
    private WebMarkupContainer logEntryListContainer;   

    public LogPage(PageParameters pp) {
        super(pp);
        Project activeProject = SciProSession.get().getActiveProject();
        Log log = null;
        if (activeProject.getLog()==null){
            log = new Log(activeProject);
            log = logDao.save(log);
        }else{
            log = activeProject.getLog();
        }
        logEntryList = logEntryDao.findAll();
        Collections.sort(logEntryList);

        logEntryListContainer = new WebMarkupContainer("logEntryListContainer");
        logEntryListContainer.setOutputMarkupId(true);

        dataView = (DataView<LogEntry>) new DataView<LogEntry>("logEntryDataView", new ListDataProvider(logEntryList)) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(final Item<LogEntry> item) {
                final LogEntry logEntry = item.getModelObject();

                item.add(new Label("contents", logEntry.getContents()));
                item.add(new Label("creator", logEntry.getCreator().toString()));

                AjaxActionIcon deleteIcon = new AjaxActionIcon("deleteIcon", ImageIcon.ICON_DELETE){
                    private static final long serialVersionUID = 1L;
                    @Override
                    protected void onClick(AjaxRequestTarget target) {
                        LogEntry toBeRemoved = logEntryDao.reLoad(logEntry);
                        toBeRemoved.setDeleted(true);
                        logEntryDao.save(toBeRemoved);
                        logEntryList = logEntryDao.findAll();
                        target.addComponent(logEntryListContainer);

                    }
                };
                item.add(deleteIcon);               
            }
        };

        dataView.setItemsPerPage(10);
        logEntryListContainer.add(dataView);
        logEntryListContainer.add(new PagingNavigator("navigator", dataView));
        add(logEntryListContainer);

    }


}

Ответы [ 2 ]

4 голосов
/ 29 сентября 2011

Вы меняете то, на что указывает переменная logEntryList, но это не влияет на то, что видит новый ListDataProvider (logEntryList).

После перезагрузки вы можете сделать

  • logEntryList.clear (). addAll (logEntryDao.findAll ()), чтобы переменная, на которую обновляется поставщик данных,
  • предоставляла собственную реализацию DataProvider
1 голос
/ 29 сентября 2011

Вы переходите в список logEntries при создании DataView. Любые изменения в списке впоследствии не будут отражены. Попробуйте обернуть список в PropertyModel и предоставить для него получатель.

...