我有一个属于用户的文件夹列表,我希望他们能够通过拖放来重新排序。我可以让拖放工作ok,但我无法弄清楚如何保存结果。我正在使用Parse,我认为这意味着我必须检索每个对象,更改order属性,然后重新保存它。..但这似乎不起作用,因为它们都以相同的顺序出现。

排序后再做。sortable('toArray'),我有一个文件夹id数组,前面加上单词'folder',所以它看起来像["folder_ab9gu3nd","folder_kwkgiutyqo","folder_s856skt8w"]。

所以,我想保存文件夹ab9gu3nd与订单0,kwkgiutyqo与订单1,和s856skt8w与订单2。

这是我的代码('result'是带有文件夹id的数组):

        for(var ii=0; ii<result.length; ii++) {
                            // Get actual id
            var folderId = result[ii].replace('folder_', '');
            var folderOrder = ii;
            var folder = Parse.Object.extend("Folder");
            var query = new Parse.Query(folder);
            query.get(folderId, {
                success: function(folder) {
                    // The object was retrieved successfully.
                    folder.set('order', folderOrder);
                    folder.save();
                }
            });
        }

当我运行这个时,文件夹都以顺序'2'结束,就好像所有文件夹都使用了ii的最终值。我如何阻止这种情况发生?谢谢!

有帮助吗?

解决方案

你被两件事愚弄了:

  1. 你的 var循环内部的s被提升到周围的函数,它们不是循环的本地函数。
  2. 你的 success 处理程序是异步触发的,它们是关闭的 完全一样 folderOrder.

对于第一个,就JavaScript而言,您的循环实际上看起来像这样:

function whateverItIsCalled() {
    var folderId, folderOrder, folder, query, ii;
    //...
    for(ii = 0; ii < result.length; ii++) {
        //...
        folderOrder = ii;
        //...
    }
    //...
}

所以只有一个 folderOrder 对于整个函数和你的循环简单地分配 ii 在每次迭代中。

第二个问题是通常的"循环中的AJAX"问题:你正在构造一系列匿名函数,这些函数在同一个函数上是闭包 folderOrder 变量。这样做的结果是,你的三个 success 处理程序最终引用相同的 folderOrder 值,当它们被触发时,循环将完成并 folderOrder 将从循环中获得它的最后一个值;在你的情况下,最后一个值是两个。

要解决你的问题,你只需要得到单独的 folderOrder 各种价值 success 处理程序。一种方法是使用函数生成成功处理程序:

function makeSuccess(folderOrder) {
    return function(folder) {
        folder.set('order', folderOrder);
        folder.save();
    }
}

然后:

query.get(folderId, {
    success: makeSuccess(folderOrder)
});

另一种常见的方法是使用自执行函数来有效地为循环的主体创建一个不同的范围:

for(var ii = 0; ii < result.length; ii++)
    (function(ii) {
        // Same stuff you currently have...
    })(ii);

你采取哪种方法是个人偏好的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top