我不确定该怎么称呼这个问题,但这是问题所在。
我有以下$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;
});
});
基本上它会收集两种类型的所谓modules
将它们插入一个公共列表然后对此列表进行排序。
我有变量isSorted
的原因是为了确保在创建列表时不会一遍又一遍地调用watcher
函数。
这适用于10以下的列表(主要是因为我认为排序足够快)但是对于更大的列表(比如20项),在列表完成生成之前调用isSorted = 1
从而使我的系统重新排序列表中的项目以奇怪的方式。
我的问题是如何避免这种情况?
答案 0 :(得分:2)
看起来您使用错误的比较功能进行排序,请尝试
return a.sort_number - b.sort_number;
代替。