2015-07-10 10 views
0

我還沒有確定怎麼稱呼這個問題,但這裏是問題。我在上面的函數之前設置的角度變量是完整的

我有以下$watch

$scope.$watch('academyModules', function (newVal) { 
    var i = 1; 
    var shouldIUpdate = false; 
    if ($scope.isSorted) { 
     newVal.forEach(function (y) { 
      if (y.sort_number != i) { 
       shouldIUpdate = true; 
      } 
      i++; 
     }); 
     if (shouldIUpdate) { 
      $scope.rearrangeModules(); 
     } 
    } 
}, true); 



$scope.rearrangeModules = function() { 
    var currentSortNumber = 1; 
    for (var i = 0; i < $scope.academyModules.length; i++) { 
     $scope.academyModules[i].sort_number = currentSortNumber; 
     if ($scope.academyModules[i].module_id == null) { 
      $http({ 
       url: api.getUrl('updateCourseSortNumber', [$scope.academyModules[i].id, $scope.academyModules[i].sort_number]), 
       method: "POST", 
       data: { 
        academyCourse: $scope.academyCourse 
       } 
      }).success(function (data, status, headers, config) { 
      }).error(function (data, status, headers, config) { 

      }); 
     } 
     else { 
      $http({ 
       url: api.getUrl('updateSortNumber', null), 
       method: "POST", 
       data: { 
        module: $scope.academyModules[i] 
       } 
      }).success(function (data, status, headers, config) { 
      }).error(function (data, status, headers, config) { 

      }); 
     } 
     currentSortNumber++; 
    } 
} 

這是用來當我使用拖放在列表中刪除一個項目。

list是從$http請求,看起來像這樣收集:

$http.get(api.getUrl('modulesByAcademy', $scope.current_id)) 
    .success(function (response) { 
     $scope.academyModules = []; 
     if (response != "") { 
      response.forEach(function (y) { 
       $scope.academyModules.push(y); 
      }); 
     } 
     $http.get(api.getUrl('academyCourseByAcademy', $scope.current_id)) 
      .success(function (response) { 
       if (response != "") { 
        response.forEach(function (y) { 
         $scope.academyModules.push(y); 
        }); 
        $scope.academyModules.sort(function (a, b) { 
         return a.sort_number > b.sort_number; 
        }); 
       } 
       $scope.isSorted = true; 

      }); 
    }); 

basicly這是什麼做它收集兩種類型的所謂modules將它們插入到一個共同的列表,然後排序這個列表。

我有變量isSorted的原因是爲了確保watcher函數在創建列表時不會反覆調用。

這適用於10以下的列表(主要是因爲我認爲排序速度夠快),但是對於更大的列表(比如說20個項目),在列表完成生成之前調用isSorted = 1,從而使我的系統重新排序以奇怪的方式列出。

我的問題是我該如何避免這種情況?

+0

拋開你的問題,儘量使用$ q.all而不是在promise中調用promise。至少它應該適合你的情況。 academyCourseByAcademy api不依賴於modulesByAcademy的輸出。我不確定你的所有用例,但我認爲你不需要一個觀察者(對於這種情況)。在解決承諾後,您可以將觀察者移動到服務並調用服務。也許你沒有公佈所有案例,只是一個建議。 – Bharat

回答

2

看起來你使用了錯誤的你比較排序功能,嘗試

return a.sort_number - b.sort_number; 

代替。

+0

這實際上做了竅門,你可以解釋爲什麼這會影響它? –

+1

比較函數的一般合同是三個值: if(a b)return 1; (或大於零的任何東西) 布爾表達式a> b是兩個值(0或1),所以當 gary

相關問題