2010-11-15 9 views
1

Salut, je joue avec GWT le week-end, et j'aime beaucoup ce que j'ai vu jusqu'ici. J'ai 2 questions:GWT - Rafraîchir un élément sur la page

  1. Je ne comprends pas vraiment le modèle d'exécution de mon application. Je pense c'est parce que je ne sais pas javascript. Je suppose qu'il y a seulement un thread logique du navigateur exécutant le javascript et est le même fil qui met à jour l'affichage (en ne tenant pas compte des demandes asynchrones ). Ainsi, lorsque j'ajoute 50 éléments à une image, les 50 éléments s'affichent une fois que tous les éléments sont ajoutés au cadre. En d'autres mots, après que le js a fini d'exécuter. Est-ce que je l'ai non? Y a-t-il des articles sur ce sujet?

  2. Désolé, ce n'est pas un bon exemple, mais il se peut que j'obtienne ma question across. Que dois-je faire dans la situation suivante (conception): a) mettre à jour le texte dans une étiquette à "démarrer ..." b) faire un tas de manipulations js et dom c) mettre à jour le texte dans l'étiquette à " fini!"

Actuellement, tout ce que je vois est le contrecoup: ma manipulation dom et "fini". L'étiquette n'affiche jamais "démarrage ..."

Comment puis-je forcer l'actualisation de l'étiquette entre l'étape a & b. J'ai vu quelques messages décrivant que l'on pouvait utiliser le Timer et forcer en quelque sorte l'élément à actualiser. Mais je ne peux pas comprendre comment cela est réalisé.

Dans l'attente de vos suggestions. Merci d'avance.

Répondre

2

À 1): Oui, javascript est monothread. C'est à vous de mettre en œuvre des opérations de longue durée comme non bloquantes. Sinon, vous risquez de rencontrer Slow Script Warnings (voir point suivant). Pour 2): Jetez un oeil à la classe IncrementalCommand (son utilisation est décrite here). Avec lui, vous pouvez diviser les opérations de longue durée en morceaux de plus petit travail et afficher les mises à jour de progression à l'utilisateur. Un petit exemple:

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

Hope that helps.

+0

Merci! Je vais essayer cela et mettre à jour le fil. – hba

+0

Cela a fonctionné parfaitement ... Merci! – hba

+0

De rien! – z00bs

Questions connexes