jquery-uiダイアログで開き、ajax経由で送信し、json形式で更新されたデータを読み取り、ページを更新するフォームがあります。最初はすべて正常に動作します。以降の実行では、データはデータベースで正しく更新されますが、ページの更新は最初の実行と同じセルに適用されます。
Web開発者ツールバーの「生成されたソースの表示」を使用すると、古いフォームがまだDOMに残っていることがわかります。したがって、これ$("form#hostEdit").find("input#id").val()
は常に最初のフォームを見つけるか、一度だけ評価されているのではないかと思います。私はjQueryにかなり慣れていないので、どうしたらよいかわかりません。そのフォームはまだDOMにあるべきですか?別のセレクターを使用する必要がありますか?完全に他の何か?
$("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;
});
更新を適用する関数:
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");
});
}