J'ai un problème lors de l'utilisation de la fonction jquery.each()
dans un jquery.getJSON
. Dans mon code, il y a 2 types d'éléments dont je parle. "Sources" et "Streams" Je veux utiliser getJSON
pour obtenir les sources, les parcourir et générer un en-tête d'accordéon. Puis, pour chacune de ces "sources", j'utilise à nouveau getJSON
avec l'identifiant de cette source pour obtenir ses "flux" correspondants. Ensuite, j'ajoute ces flux à son corps d'accordéon sources, pour obtenir une liste de tous les flux, triés par leurs sources.
Mais il semble que pendant que j'obtiens le JSON, les instructions suivantes dans ma procédure sont déjà exécutées. Comme je construis de manière dynamique une grande chaîne HTML et l'ajoute à un élément en utilisant jQuery, la chaîne n'obtient pas toutes les données dont elle a besoin.
Le code se présente comme suit:
var html1 = "<div class='panel-group' id='manageAccordion'>";
$.getJSON(url, function(data){
$.each(data, function(i, json){
html1 += getAccordionPart(...); //creates the accordion for the given source
});
}).done(function(){
html1 += "</div>";
$('#elementList').html(html);
});
function getAccordionPart(id, parent, count, json){
//new string html2 is created and a bunch of stuff added
//...
html2 += "....";
html2 += getAccordionBody(json);
html2 += "</div></div></div></div>";
return html2
}
function getAccordionBody(json){
//new string "html3" gets created
//...
var url = standardUrl + "sources/" + encodeURIComponent(json.elementId) + "/streams";
$.getJSON(url, function(data) {
$.each(data, function(i, json) {
html3 += "<li class='list-group-item'>";
html3 += json.name;
html3 += "</li>";
});
}).done(function(){
html3 += "</ul>";
return html3;
});
}
Ce que je finis spécifiquement avec est un en-tête d'accordéon qui a « non défini » dans ce son corps, parce qu'il semble la fonction getAccordionBody()
n » t retourne avant que la chaîne html ne soit ajoutée au DOM.
Je l'ai déjà essayé de changer le $.getJSON
-$.ajax
avec async = false
, sur mes deux $.getJSON
appels, cela semble résoudre le problème que les déclarations n'exécutent pas dans l'ordre que je veux qu'ils, mais il est horriblement lent et renvoie undefined de toute façon pour une raison quelconque ..
Des suggestions? Ai-je raté quelque chose de vraiment stupide?
Il sera bon de générer le code HTML sur le serveur. Comme il dose ne nécessite aucune entrée de l'utilisateur du client avec la fin dans la boucle. Il sera donc préférable de créer cette chaîne html sur le serveur. Ce sera beaucoup plus rapide. Dans tous les cas, si votre design est obligatoire, essayez $ .ajax avec l'option cache: false et async: false. – Priyank
Il est fou d'essayer et de faire ce genre de choses dans jQuery quand il y a des bibliothèques mvvm appropriées comme knock-out et angulaire – andrew