ng-repeat在Angular js中没有正确更新

时间:2017-11-22 13:17:38

标签: javascript angularjs

我正试图对ng-repeat进行分页。获得结果但是时间显示旧数据并突然隐藏并显示新的设置数据,如抽搐。我的angularjs版本是“1.5.8”。

$scope.gap = 5;

        $scope.filteredItems = [];
        $scope.groupedItems = [];
        $scope.itemsPerPage = 5;
        $scope.pagedItems = [];
        $scope.currentPage = 0;
        var resultData = [...];
        var searchMatch = function (haystack, needle) {
            if (!needle) {
                return true;
            }
            return haystack.toLowerCase().indexOf(needle.toLowerCase()) !== -1;
        };

        // init the filtered items
        $scope.search = function () {
            $scope.filteredItems = $filter('filter')(resultData, function (item) {
                for(var attr in item) {
                    if (searchMatch(item[attr], $scope.query))
                        return true;
                }
                return false;
            });
            // take care of the sorting order

            $scope.currentPage = 0;
            // now group by pages
            $scope.groupToPages();
        };

        $scope.groupToPages = function () {
            $scope.pagedItems = [];

            for (var i = 0; i < $scope.filteredItems.length; i++) {
                if (i % $scope.itemsPerPage === 0) {
                    $scope.pagedItems[Math.floor(i / $scope.itemsPerPage)] = [ $scope.filteredItems[i] ];
                } else {
                    $scope.pagedItems[Math.floor(i / $scope.itemsPerPage)].push($scope.filteredItems[i]);
                }
            }
            console.log($scope.pagedItems)
        };

        $scope.range = function (size,start, end) {
            var ret = [];        
            //console.log(size,start, end);

            if (size < end) {
                end = size;
                start = size-$scope.gap;
            }
            for (var i = start; i < end; i++) {
                ret.push(i);
            }        
            // console.log(ret);        
            return ret;
        };

        $scope.prevPage = function () {
            if ($scope.currentPage > 0) {
                $scope.currentPage--;
            }
        };

        $scope.nextPage = function () {
            if ($scope.currentPage < $scope.pagedItems.length - 1) {
                $scope.currentPage++;
            }               
        };

        $scope.setPage = function () {
            console.log($scope.pagedItems[$scope.currentPage]);
            $scope.currentPage = this.n;
        };

        $scope.search();

HTML

<tr ng-repeat="user in pagedItems[currentPage]" >
        <td>{{user.name}} {{$index}}</td>
      </tr>

如上面的代码,该表行更新为5行。但是当我点击下一个或显示10行的页码并隐藏5行时。我希望你能理解这些家伙!帮助我。

2 个答案:

答案 0 :(得分:0)

在我看来,你错了,使用自定义过滤器更简单,并像这样分解你的业务逻辑

app.filter('startFrom', function() {
        return function(input, start) {
            start = +start;
            return input.slice(start);
        }
    });

然后在控制器中你可以做

$scope.showResults = function() {
                        $scope.list = $filter('startFrom')($scope.initialList, $scope.page * $scope.itemsPerPage);
                        $scope.list = $filter('limitTo')($scope.list, $scope.itemsPerPage);
                    }
                };

现在你只需更新$ scope.page并重用$ scope.showResults()来更新视图

<tr ng-repeat="user in list" >
    <td>{{user.name}} {{$index}}</td>
  </tr>

答案 1 :(得分:0)

我不认为你的问题是由ng-repeat引起的。我只需要你的代码,添加一些虚拟数据并进行测试,它完全正常。

您可以在此处查看https://codepen.io/Cushdrive/pen/zvPPXd

因为angular是双向绑定,所以我想知道是否可能在某处触发了一些分页信息。您是否可以仔细检查某些变量,例如currentPage itemPerPagespagedItems,看看它是否在其他地方使用过?