2010-09-16 18 views
3

Ce n'est pas une question de rappel de requête/réponse AJAX ...Comment appeler une fonction (non AJAX) après la fin d'une autre fonction (non AJAX) dans Dojo?

Je construis une grille en utilisant Dojo 1.5. J'essaie de dojo.connect élargir/contrat des boutons avec une fonction. Mon problème est que la méthode grid.startup() semble prendre un certain temps après avoir été appelée avant que les nœuds DOM réels ne soient créés, donc quand j'appelle dojo.query, aucun des nœuds DOM auxquels je veux connecter les événements et les gestionnaires n'est présent.

J'ai créé la grille à l'intérieur d'une méthode init(), appelée par dojo.addOnLoad(). J'ai la méthode connectExpandos() connectée à init() via dojo.connect ("init", connectExpandos); Cela s'exécute bien, mais j'ai besoin de setTimeout() dans une boucle while pour attendre la fin de grid.startup() ...

Quelqu'un sait-il comment faire? Peut-être un rappel grid.startup() que je peux accrocher? Merci pour vos idées. -robbie

+0

J'ai trouvé une méthode dans DataGrid appelée "PostCreate" que, selon la documentation « Dérogations dijit._Widget, dojox.grid._Grid Appelé après la configuration du dom d'un widget ". Mais quand j'inclus ma méthode connectExpandos dans le constructeur DataGrid je n'obtiens aucun résultat (pas de lignes retournées quand d'habitude beaucoup) ... peut-être que je dois faire un appel aux méthodes parentes dans la mienne d'abord? – Robbie

+0

Tentative d'étendre la méthode postCreate dans DataGrid continue de ne donner aucun résultat ... On dirait que je suis coincé avec le vieux setTimeout ... – Robbie

+0

Vous pouvez remplacer postCreate, assurez-vous juste d'appeler "this.inherited (arguments);" avant d'ajouter votre code. – JasonStoltz

Répondre

3

Une autre suggestion ... il ressemble à la fonction "démarrage", qui est mis en œuvre en super classe DataGrid, _Grid (http://svn.dojotoolkit.org/src/dojox/trunk/grid/ Grid.js), appelle une fonction appelée render, qui je crois est ce qui rend réellement le contenu de la grille. Par la suite, il semble que les appels de rendu soient une méthode "postrender" une fois le rendu terminé. Peut-être pourriez-vous connecter votre méthode à la méthode "postrender" au lieu de "startup".

dojo.connect(grid, "postrender", function(){connectExpandos()}) 
0

Je pense que vous pouvez simplement connecter un événement à la méthode de démarrage du réseau

dojo.connect(grid, "startup", function(){connectExpandos()}) 
+0

Il semble que connectExpandos se déclenche avant la fin du démarrage, même avec cette modification. Je ne pense pas que dojo.connect attende qu'une fonction soit terminée avant que l'événement ne soit déclenché ... mais je peux me tromper. La documentation de Dojo dit: «Connecte la méthode à l'événement, de sorte qu'après les incendies d'événements, la méthode le fasse aussi Toutes les fonctions connectées reçoivent les mêmes arguments que la fonction de l'événement a été initialement appelée Vous pouvez connecter autant de méthodes que nécessaire. - Cela ne mentionne pas quelle partie d'une étape d'exécution de la fonction est considérée comme l'événement. – Robbie

0

Vous pouvez essayer de créer le widget programatically (en supposant que vous n'êtes pas déjà), alors il suffit d'appeler votre méthode après l'appel démarrage() (Il semble étrange d'appeler startup() manuellement, mais l'exemple qu'il montre dans les commentaires source montre l'appel manuel de grid.startup()).

<script type="text/javascript"> 
    var grid = new dojox.grid.EnhancedGrid({plugins : {nestedSorting: true, dnd: true, indirectSelection: true, 
    menus:{headerMenu:"headerMenuId", rowMenu:"rowMenuId", cellMenu:"cellMenuId",selectedRegionMenu:"selectedRegionMenuId"}}, 
    ... }, dojo.byId('gridDiv')); 
    grid.startup(); 
    connectExpandos(); 
</script> 
+0

Jason, merci pour la réponse - c'était ce que je faisais - startup() n'a pas fini de créer les nœuds DOM au moment où la requête dojo.query dans connectExpandos a été exécutée. La prochaine fois que je vais afficher du code ... – Robbie

1

Je pense que le rappel que vous recherchez a été _onFetchComplete

dojo.connect(grid,'_onFetchComplete',function(event){ 
    alert("hello data is loaded") 
});