2010-11-15 110 views
1

嗨我在週末玩GWT,我真的很喜歡我目前看到的 。我有2個問題:GWT - 刷新頁面上的元素

  1. 我真的不明白我的應用程序的執行模型。我認爲 這是因爲我不知道JavaScript。我假設有 只有一個來自運行javascript的瀏覽器的邏輯線程,而它是 是更新顯示的同一個線程(不考慮異步 請求)。因此,當通過js將50個元素添加到一個幀中時,將所有這些元素添加到幀中之後,都會顯示這些50 元素。在 之後,在js執行完之後。我有 對嗎?那裏有關於這個話題的文章嗎?

  2. 對不起,這不是一個很好的例子,但它可能會得到我的問題 跨過。在以下情況下我應該做什麼(設計): a)將標籤中的文本更新爲「開始...」 b)做一堆js和dom操作 c)將標籤中的文本更新爲「完了!」

目前,所有我看到的是後效果:我DOM操作和 「完成」。標籤從不顯示「開始...」

如何強制標籤刷新步驟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 2010-11-16 00:07:31

+0

這工作完美...謝謝! – hba 2010-11-16 02:52:44

+0

不客氣! – z00bs 2010-11-16 08:39:43