我有一个连接到可排序列表的可拖动列表。拖放工作正常,排序也很好。问题是在列表排序之前,我需要在DB中创建一条记录(使用rails)。所以我使用$ .post工作正常,但我需要更改插入元素的id。我通过使用$ .post回调更改inserted元素的id来实现此目的。工作正常,但它发生在排序后。如果你想知道为什么我没有使用可拖动的停止回调,那是因为它是同样的事情。这是缩写代码(删除不相关的db东西):
$("#operations_container").sortable({items:'.process_small', axis:'y', update: function(ev,ui) {
if (ui.item.attr('id').match("workcenter"))
{
$.post('/operations', 'fancyrailspoststuffignore', function(data) {
$("#operations_container > #workcenter_" + workcenterid).attr("id", "operation_" + data.operation.id);
}, "json");
}
$.post('/jobs/sort/<%= @job.id %>', 'morefancyschamncyrailsjunk);
}});
可分类容器很简单:
<div id="operations_container" class="in_grid">
</div>
所以在我看来,在排序之后所有回调都被称为。这是真的?如果您需要在排序之前更新DOM,您如何解决这个问题?
更新:如果他们在评论中被遗漏,以下是说明问题的图片和示例文件。
图片:http://dl.getdropbox.com/u/1826667/sortable.png 示例文件:http://dl.getdropbox.com/u/1826667/jquery_callback_order.zip
所以看起来回调总是在任何其他事件结束时结束,无论它们在何处被调用(@ .post回调之前仍然可以调用可排序更新,等等)。我不认为这是JQuery中的失败(尽管我发现它很奇怪);我试图做一些帖子(这是必需的,因为它们是共同依赖的;创建一个记录然后排序)一次性可能不是这样做的方式。我会尝试在后端解决它(我有一些工作),所以我会认为这是封闭的。感谢所有帮助解决问题的人。 SO规则。
MEGAIMPORTANTUPDATE:它正在运作!肖恩得到了它(见答案),我仍然有点头晕。这件事已经过了几天。再次感谢大家,尤其是肖恩。你摇滚。
答案 0 :(得分:2)
啊哈!得到它了。那张照片正是我所需要的。这是做什么的:
$("#operations_container").sortable({items:'.process_small', axis:'y', update: function(ev,ui) {
var sortDbTable = function(){
$.post('/jobs/sort/<%= @job.id %>', 'morefancyschamncyrailsjunk);
}
if (ui.item.attr('id').match("workcenter"))
{
$.post('/operations', 'fancyrailspoststuffignore', function(data) {
$("#operations_container > #workcenter_" + workcenterid).attr("id", "operation_" + data.operation.id); //is there any reason you're not using the ui.item.attr("id",...) here?
sortDbTable(); //this will make sure id is changed before DB sort
}, "json");
} else { //else not absolutely needed, but will make sure it's not unnecessarily sorted again
sortDbTable();
}
}});
答案 1 :(得分:0)
在更新事件之前,调用start事件,您可以使用它。