2017-10-10 4 views
1

J'ai un HighMap avec une paire de boutons qui sont utilisés pour changer entre les ensembles de données - cela fonctionne comme prévu. Je voulais ajouter un fondu pour que le changement entre les ensembles de données soit fluide. Cependant, la carte semble mettre à jour les données avant la fin du fondu, même si cela se produit dans la fonction de rappel du fondu.Avec Highmaps, pourquoi le rappel dans ma jQuery fadein se produit-il avant la fin du fondu?

est ici le bit correspondant du code avec les touches:

var resetMap = function(dataCurrent) { 
SetOptions(dataCurrent); 
AccessMap.update({title: {text: dataTitle}}); 
AccessMap.update({colorAxis: {max: dataMax, min: dataMin, minColor: dataMinColor, maxColor: dataMaxColor,type: dataScale}}); 
AccessMap.update({series:[{name: dataTitle,tooltip:{ valueSuffix: dataTooltipSuffix}}]}); 
AccessMap.series[0].setData(dataCurrent.slice()); 
}; 

$('#setdataPop').click(function() { 
$("#container").fadeOut(500,resetMap(pop)); 
$("#container").fadeIn(500); 
}); 

$('#setdataRate').click(function() { 
$("#container").fadeOut(500,resetMap(rate16)); 
$("#container").fadeIn(); 
}); 

Une version simplifiée de ma carte complète de travail (qui comprend la fonction setOptions référencé dans cet extrait) est ici:

https://jsfiddle.net/MossTheTree/h5njdqLf/3/

Répondre

1

Vous exécutez resetMap en place, sans passer une référence de fonction. Vous aussi probablement voulez exécuter le fadeIn dans le rappel aussi:

$("#container").fadeOut(500, function() { 
    resetMap(pop); 
    $("#container").fadeIn(500); 
}); 
+0

Parfait, merci. Je vais devoir en lire plus pour bien comprendre la différence - il semble que je doive définir une fonction dans le rappel, plutôt que de l'appeler directement. – Moss

+0

Vous ne devriez pas l'appeler directement puisque vous ne voulez pas que les effets secondaires de cette fonction se produisent immédiatement. Les animations sont asynchrones par nature, ce qui signifie qu'elles se terminent dans le futur. jQuery vous permet de définir ce qui se passe une fois l'animation terminée. C'est pourquoi vous voulez donner la référence à votre fonction à jQuery, afin qu'elle puisse l'appeler quand l'animation est terminée, plutôt que de l'invoquer immédiatement. –

+0

En outre, ce qui m'a facilité la tâche, c'est de penser aux fonctions en termes d'effets. Chaque fois qu'une étiquette se termine par '()', cela signifie que vous l'invoquez immédiatement. Si vous substituez ce bit entier au résultat de la fonction (ou à ses effets), voudriez-vous que cela se produise là ou non? –