GWT - 刷新页面上的元素

时间:2010-11-15 00:18:58

标签: multithreading gwt

你好我周末和GWT一起玩,我真的很喜欢我所见过的 至今。我有两个问题:

  1. 我真的不了解我的应用程序的执行模型。我认为 那是因为我不知道javascript。我假设有 只有一个逻辑线程来自浏览器运行javascript和它 是更新显示的相同线程(忽略异步 要求)。因此,当通过js我向帧添加50个元素时,50 将所有元素添加到框架后显示元素。在 换句话说,在js完成执行之后。我有吗 对?是否有关于这个主题的文章?

  2. 对不起,这不是一个很好的例子,但它可能会引起我的疑问 跨越。在以下情况(设计)中我该怎么办: a)将标签中的文本更新为“开始......” b)做一堆js和dom操作 c)将标签中的文字更新为“已完成!”

  3. 目前,我所看到的只是后遗症:我的dom操纵和 “完了”。标签永远不会显示“开始...”

    如何强制标签在步骤a&湾我见过 一些帖子描述了一个人可以使用Timer并以某种方式强行 要刷新的元素。但我无法弄清楚这是如何实现的。

    期待您的建议。提前谢谢。

1 个答案:

答案 0 :(得分:2)

To 1):是的,javascript是单线程的。您可以将长时间运行的操作实现为非阻塞。否则你可能会遇到Slow Script Warnings(见下一点)。

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

希望有所帮助。