Donc, j'ai une page qui charge et grâce à jquery.obtenir fait plusieurs demandes pour remplir des listes déroulantes avec leurs valeurs.
$(function() {
LoadCategories($('#Category'));
LoadPositions($('#Position'));
LoadDepartments($('#Department'));
LoadContact();
};
Il appelle ensuite LoadContact(); Qui ne un autre appel, et quand il revient il remplit tous les champs du formulaire. Le problème est que, souvent, les listes déroulantes ne sont pas tous remplis, et donc, il ne peut pas les mettre à la bonne valeur.
Ce dont j'ai besoin pour être en mesure de le faire, est en quelque sorte LoadContact exécuter uniquement une fois que les autres méthodes sont complètes et des rappels de service effectuée en cours d'exécution.
Mais, je ne veux pas avoir à mettre un tas de drapeaux à la fin de la liste déroulante de la population rappels, que je vérifie, et avoir un récursif appel de setTimeout vérifier, avant de faire appel à LoadContact();
Est-il quelque chose en jQuery qui me permet de dire, "Exécuter ce, lors de toutes ces sont faites."?
Plus D'Infos Je pense à quelque chose le long de ces lignes
$().executeAfter(
function () { // When these are done
LoadCategories($('#Category'));
LoadPositions($('#Position'));
LoadDepartments($('#Department'));
},
LoadContact // Do this
);
...il aurait besoin de garder une trace des appels ajax qui se produisent lors de l'exécution des méthodes, et quand ils sont tous complets, appel LoadContact;
Si je savais comment intercepter ajax qui sont faits dans cette fonction, je pourrais probablement écrire une extension jQuery pour ce faire.
Ma Solution
;(function($) {
$.fn.executeAfter = function(methods, callback) {
var stack = [];
var trackAjaxSend = function(event, XMLHttpRequest, ajaxOptions) {
var url = ajaxOptions.url;
stack.push(url);
}
var trackAjaxComplete = function(event, XMLHttpRequest, ajaxOptions) {
var url = ajaxOptions.url;
var index = jQuery.inArray(url, stack);
if (index >= 0) {
stack.splice(index, 1);
}
if (stack.length == 0) {
callback();
$this.unbind("ajaxComplete");
}
}
var $this = $(this);
$this.ajaxSend(trackAjaxSend)
$this.ajaxComplete(trackAjaxComplete)
methods();
$this.unbind("ajaxSend");
};
})(jQuery);
Cela se lie à la ajaxSend événement alors que les méthodes sont appelés et maintient une liste d'url (besoin d'une meilleure id unique si) qui sont appelés. Puis, il se délie de ajaxSend de sorte que seules les demandes qui nous intéresse ce sont suivies. Il se lie également à ajaxComplete et supprime les éléments de la pile de retour. Lorsque la pile atteint zéro, il exécute notre rappel, et délie les ajaxComplete événement.