0

我正在使用 jQuery 允许在两个列表之间拖放,但我没有得到我期望的行为。

每个列表都有两对,idteams_in_set<set-number>teams_not_in_set<set-number>,类的所有成员connected-sortable。页面上将有任意数量的这些配对,最后的集合编号为 0,表示正在创建一个新集合(与正在编辑的现有集合相反)。

我正在使用以下功能进行设置$(document).ready


    var teams_in_set_pattern = /^teams_in_set(\d*)$/;
    $(function() {
        var connected_list = $(".connected-sortable");
        for (var i = 0; i < connected_list.length; i++) {
            var id = connected_list[i].id;
            if (teams_in_set_pattern.test(id)) {
                var set_num = id.match(teams_in_set_pattern)[1];
                var teams_in = "#teams_in_set" + set_num;
                var teams_out = "#teams_not_in_set" + set_num;

                if (set_num > 0) {
                    $(teams_in + ", " + teams_out).sortable({
                        revert: true,
                        connectWith: ".connected-sortable", 
                        cursor: 'move', 
                        receive: function(event, ui) {
                            update_teams(set_num);
                        } 
                    }).disableSelection();
                }
                else {
                    $(teams_in + ", " + teams_out).sortable({
                        revert: true,
                        connectWith: ".connected-sortable", 
                        cursor: 'move', 
                    }).disableSelection();
                }
            }
        }
    });

这个想法是,当一个团队从一个列表移动到另一个列表时,update_teams(set_num);会调用该行,触发一些更新数据库的 Ajax。问题是变量set_num;似乎不是保留receive:填充时的值,而是具有上次设置的值,最终始终为 0。

我有什么误解?我需要做什么才能获得我想要的行为?

4

1 回答 1

1

这是异步 Javascript 中的常见问题。到 update_teams 运行时,循环已经运行。

参见类似的问题:循环内的 JavaScript 闭包 – 简单实用的示例

我通常将问题代码移到它自己的函数中,例如

function doIt(teams_in, teams_out, set_num) {
   if (set_num > 0) {
                $(teams_in + ", " + teams_out).sortable({
                    revert: true,
                    connectWith: ".connected-sortable", 
                    cursor: 'move', 
                    receive: function(event, ui) {
                        update_teams(set_num);
                    } 
                }).disableSelection();
            }
    else {
                $(teams_in + ", " + teams_out).sortable({
                    revert: true,
                    connectWith: ".connected-sortable", 
                    cursor: 'move', 
                }).disableSelection();
    }
}
于 2012-07-26T02:03:17.090 回答