代码之家  ›  专栏  ›  技术社区  ›  hba

GWT-刷新页面上的元素

  •  1
  • hba  · 技术社区  · 14 年前

    嗨,我周末和GWT一起玩,我真的很喜欢我看到的 到目前为止。我有两个问题:

    1. 我不太了解我的应用程序的执行模式。我想 那是因为我不懂javascript。我想 浏览器中只有一个运行javascript的逻辑线程 是更新显示的同一线程(忽略异步 请求)。所以当我通过js向一个框架添加50个元素时 所有元素都添加到框架后将显示。在 换句话说,在js完成执行之后。我有吗 正确的?有关于这个话题的文章吗?

    2. 抱歉,这不是一个很好的例子,但它可能会引起我的问题 穿过。在下列情况下(设计)我该怎么做: a) 将标签中的文本更新为“开始…” b) 做一些js和dom操作 c) 将标签中的文本更新为“已完成!”

    目前,我看到的只是后遗症:我的dom操作和 “完成”。标签从不显示“开始…”

    如何在步骤a和b之间强制标签刷新。我已经看到 一些帖子描述了一个人可以使用定时器和某种方式 要刷新的元素。但我不知道这是怎么实现的。

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

    1 回复  |  直到 14 年前
        1
  •  2
  •   z00bs    14 年前

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

    希望能有所帮助。