GWT - Обновление элемента на странице - PullRequest
1 голос
/ 15 ноября 2010

Привет, я играю с GWT по выходным, и мне очень нравится то, что я видел до сих пор. У меня есть 2 вопроса:

  1. Я не совсем понимаю модель исполнения моего приложения. Я думаю это потому что я не знаю javascript. Я предполагаю, что есть только один логический поток из браузера, выполняющего JavaScript, и это тот же поток, который обновляет отображение (не учитывая асинхронный Запросы). Поэтому, когда через JS я добавляю 50 элементов в кадр, 50 элементы отображаются после того, как все они добавлены в кадр. В другими словами, после того, как js закончил выполнение. Есть ли у меня это право? Есть ли статьи на эту тему?

  2. Извините, это не хороший пример, но он может получить мой вопрос в поперечнике. Что мне делать в следующей ситуации (дизайн): а) обновить текст в метке, чтобы "начиная ..." б) сделать кучу манипуляций с Джом и Домом в) обновить текст в метке до «готово!»

В настоящее время все, что я вижу, это последствие: мои манипуляции с домом и "законченный". На ярлыке никогда не отображается «запуск ...»

Как я могу заставить этикетку обновиться между шагами a и b. я видел некоторые посты, описывающие, что можно использовать Таймер и каким-то образом заставить элемент для обновления. Но я не могу понять, как это достигается.

Ждем ваших предложений. Заранее спасибо.

1 Ответ

2 голосов
/ 15 ноября 2010

К 1): Да, JavaScript является однопоточным. Вы должны осуществлять длительные операции как неблокирующие. В противном случае вы можете столкнуться с Slow Script Warnings (см. Следующий пункт).

К 2): взгляните на класс IncrementalCommand (его использование описано здесь ). С его помощью вы можете разделить длительные операции на куски меньшего объема работы и отображать обновления прогресса для пользователя. Небольшой пример:

public class Starter implements EntryPoint {

    private Label text = new Label();
    private Label update = new Label();

    @Override
    public void onModuleLoad() {
        Button btn = new Button("hit me");
        btn.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                text.setText("starting...");
                startIncrementalWork();
            }
        });

        RootPanel.get().add(text);
        RootPanel.get().add(update);
        RootPanel.get().add(btn);
    }

    private void startIncrementalWork() {
        IncrementalCommand cmd = new IncrementalCommand() {

            private int count = 0;

            @Override
            public boolean execute() {
                if (count >= 10000) {
                    text.setText("finished");
                    return false;
                }

                for (int i = 0; i < 100; i++) {
                    update.setText("count " + count);
                    count++;
                }
                return true;
            }
        };

        DeferredCommand.addCommand(cmd);
    }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...