Как правильно удалить AjaxSelfUpdatingTimerBehavior из компонента в Apache Wicket? - PullRequest
7 голосов
/ 31 октября 2009

У меня проблемы с добавлением, а затем удалением AjaxSelfUpdatingTimerBehavior в Apache Wicket. Поведение добавляется нормально, но потом, как только я удаляю поведение, в браузере очень скоро появляется страница «Срок действия истек», я думаю, потому что удаление не было чистым. Моя установка - это, в основном, метка, которая начинает меняться по таймеру, и две ссылки: «идти» и «останавливаться». Я хочу иметь возможность нажимать «идти», а затем «останавливаться» (очевидно, я знаю, что это никогда не сработает!). Вот моя полная разметка:

<html>    
    <body>            
        <span wicket:id="message">message will be here</span><br/>
        <a wicket:id="go">Go</a><br/>        
        <a wicket:id="stop">Stop</a>        
    </body>
</html>

и вот мой код:

// imports all from standard wicket
public class HomePage extends WebPage {

    private static final int INTERVAL = 500;

    public HomePage(final PageParameters parameters) {

        final Component label = new Label("message",
            "Hello").setOutputMarkupId(true);

        add(label);

        final IBehavior updater = new AjaxSelfUpdatingTimerBehavior(Duration
            .milliseconds(INTERVAL)) {
            @Override
            protected void onPostProcessTarget(AjaxRequestTarget target) {                    
                label.setDefaultModelObject(String.valueOf(System.nanoTime()));             
            }
        };

        AjaxLink<String> go = new AjaxLink<String>("go") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                label.add(updater);                             
                target.addComponent(label);
            }           
        };

        AjaxLink<String> stop = new AjaxLink<String>("stop") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                label.remove(updater);
                target.addComponent(label);
            }           
        };

        add(go, stop);
    }
}

Я использую Wicket 1.4.3.

Любая помощь высоко ценится. Спасибо.

Ответы [ 2 ]

3 голосов
/ 02 ноября 2009

Я решил эту проблему, используя метод stop() вместо попытки полностью удалить поведение.

Я на самом деле делаю хочу полностью удалить его в какой-то момент после его остановки (потому что мое решение заключается в обновлении поведения каждый раз, когда я нажимаю "идти" и хочу продолжать останавливаться и начинать, не набирая миллион поведений), поэтому я обошел это, сохранив список поведений, которые будут удалены во время более поздней поездки туда и обратно.

0 голосов
/ 13 ноября 2009

Было бы неплохо иметь возможность вызывать restart () или что-то в AbstractAjaxTimerBehavior для повторного включения поведения таймера.

...