我在上面的函数之前设置的角度变量是完整的

时间:2015-07-10 09:43:23

标签: javascript arrays angularjs

我不确定该怎么称呼这个问题,但这是问题所在。

我有以下$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从而使我的系统重新排序列表中的项目以奇怪的方式。

我的问题是如何避免这种情况?

1 个答案:

答案 0 :(得分:2)

看起来您使用错误的比较功能进行排序,请尝试

return a.sort_number - b.sort_number;

代替。