2012-10-03 24 views
0

我有一個屬於用戶的文件夾列表,我希望他們能夠通過拖放對它們進行重新排序。我可以讓拖放工作正常,但我無法弄清楚如何保存結果。我使用的是Parse,我認爲這意味着我必須檢索每個對象,更改順序屬性,然後重新保存它......但似乎並不奏效,因爲它們都以相同的順序出現。我有一個文件夾ID數組,前綴爲'文件夾'這個詞,所以它看起來像[「folder_ab9gu3nd」,「folder_kwkgiutyqo」,「folder_s856skt8w」),然後排序,然後做.sortable('toArray')的數組, ]。如何在Parse.com/backbone.js中保存對象順序

所以,我要保存的文件夾ab9gu3nd與秩序0,與1階kwkgiutyqo,並與秩序s856skt8w 2.

這裏是我的代碼(「結果」與文件夾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

你被兩件事情所迷惑:

  1. var■循環內被提升到周圍的功能,他們不是本地的循環。
  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); 

你採取哪種方法是個人喜好的問題。

+0

謝謝你,那太棒了。爲了提高速度,我已經實施了第二種方法,但是當我有更多時間時,我會先看看第一種方法。 – Sharon