J'ai un formulaire qui s'ouvre dans une boîte de dialogue jquery-ui, soumet via ajax, lit les données mises à jour au format json et met à jour la page. Tout fonctionne bien la première fois. Lors des exécutions suivantes, les données sont correctement mises à jour dans la base de données, mais les mises à jour sur la page sont appliquées à la même cellule que la première exécution. En utilisant "View Generated Source" dans la barre d'outils Web Developer, je peux voir que l'ancien formulaire est toujours dans le DOM. Donc, je soupçonne que ce $("form#hostEdit").find("input#id").val()
soit trouve toujours la première forme, ou est en cours d'évaluation qu'une seule fois. Je suis assez nouveau à jQuery si je ne suis pas sûr de ce qu'il faut faire à ce sujet. Est-ce que ce formulaire devrait toujours être dans le DOM? Dois-je utiliser un sélecteur différent? Quelque chose d'autre complètement?problème avec la mise à jour ajax sur les utilisations suivantes
$("table.hostgrid a.new").click(function() {
var id = this.id.substring(3);
var $dialog = $('<div></div>')
.load('/hosts/new?byte1=${network.byte1}&byte2=${network.byte2}&byte3=${network.byte3}&byte4=' + id);
var getHostAction = #{jsAction @NetworkHosts.view(':id') /}
$dialog.dialog({
autoOpen: false,
title: 'New host at ${network.byte1}.${network.byte2}.${network.byte3}.' + id,
width: 500,
buttons: {
"Create": function() {
$.ajax({
async: true,
type: 'post',
url: '/hosts/create',
data: $("form#hostNew").serialize(),
success: function(response) {
$dialog.html(response);
if ($("div.flashSuccess") != null) {
$dialog.dialog('destroy');
$.ajax({
url: getHostAction({'id': $("form#hostEdit").find("input#id").val()}),
dataType: 'json',
success: function(data) {
updateHost(data);
},
error: function(data, msg, exception) {
alert("Error during request: " + msg);
},
});
}
}
});
}
}
});
$dialog.dialog('open');
return false;
});
fonction qui applique les mises à jour:
function updateHost(host) {
var cell = $("td#dot"+host.byte4);
cell.fadeOut("fast", function() {
cell.find("span.hostname").text(host.hostname).attr("title", host.description);
cell.removeClass().addClass(host.agegroup);
if (host.type)
cell.addClass(host.type.toLowerCase());
if (host.is_dhcp)
cell.addClass("dhcp");
if (host.is_service)
cell.addClass("service");
cell.fadeIn("fast");
});
}
Avez-vous une chance de reformater votre code pour n'utiliser que deux espaces pour la taille de retrait afin de le rendre plus lisible? –
@Chris - c'était un peu excessif pour une raison quelconque. Mise à jour –
où mettre à jour $ ("form # hostEdit"). Find ("input # id") valeur? – ifaour