2010-11-15 71 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

相关问题