2010-11-15 3 views
1

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

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

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

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

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

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

ответ

2

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

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

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); 
    } 
} 

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

+0

Спасибо! Я попробую это и обновить поток. – hba

+0

Это сработало отлично ... Спасибо! – hba

+0

Добро пожаловать! – z00bs

Смежные вопросы