具有Angular UI Bootstrap分页指令的AngularJS不会隐藏结果

时间:2014-06-27 21:20:50

标签: javascript angularjs pagination angular-ui

我第一次尝试使用Angular-ui分页指令,并且很困惑为什么它不起作用。我可以看到分页按钮,它正确地显示两个页面进行分页,因为有8个结果和items-per-page="5"但是我的所有数据项都显示,而不是每页隐藏5个。

控制器

dataService.get(uri).then(function (data) {

    $scope.testimonials = data;

    $scope.totalItems = $scope.testimonials.length;
    $scope.currentPage = 1;

    $scope.setPage = function(pageNo) {
        $scope.currentPage = pageNo;
    };

    $scope.pageChanged = function() {
        console.log('Page changed to: ' + $scope.currentPage);
    }
});

查看

<table class="table table-striped" ng-show="testimonials.length">
    <thead>
      <th>Name</th>
      <th>Message</th>
    </thead>
    <tbody>
    <tr ng-repeat="testimonial in testimonials">
      <td>{{testimonial.name}}</td>
      <td>{{testimonial.message}}</td>
      <td><a href="testimonials/{{testimonial.id}}" class="btn btn-primary">Edit</a></td>
      <td><button class="btn btn-danger" ng-click="delete(testimonial)">Delete</button></td>
    </tr>
    </tbody>

    <pagination total-items="totalItems" ng-model="currentPage" items-per-page="5" ng-change="pageChanged()"></pagination>
</table>

我感谢任何建议,谢谢!

3 个答案:

答案 0 :(得分:2)

哟我们需要在你的ng-reapeter代码中使用过滤数据

<table class="table table-striped" ng-show="testimonials.length">
    <thead>
      <th>Name</th>
      <th>Message</th>
    </thead>
    <tbody>
    <tr ng-repeat="testimonial in testimonials | startFrom: (currentPage-1)*5| limitTo: 5">
      <td>{{testimonial.name}}</td>
      <td>{{testimonial.message}}</td>
      <td><a href="testimonials/{{testimonial.id}}" class="btn btn-primary">Edit</a></td>
      <td><button class="btn btn-danger" ng-click="delete(testimonial)">Delete</button></td>
    </tr>
    </tbody>

    <pagination total-items="totalItems" ng-model="currentPage" items-per-page="5" ng-change="pageChanged()"></pagination>
</table>

过滤器从:

开始
app.filter('startFrom', function () {
    return function (input, start) {



        if (input === undefined || input === null || input.length === 0
         || start === undefined || start === null || start.length === 0 || start === NaN) return [];
        start = +start; //parse to int

        try {
            var result = input.slice(start);
            return result;

        } catch (e) {

        //    alert(input);
        }

    }
});

答案 1 :(得分:0)

我无法找到我使用的原始示例,但这就是我在我的应用中所拥有的。

过滤器部分并不重要,但filterProducts对象是切片并显示在视图中的对象。查看$watch的工作原理。

app.controller('ProductController', function($scope, $filter, $routeParams, $rootScope, $location, Products){

    $scope.Products = Products;
    Products.brandLimit = $routeParams.brandLimit;
    Products.brand = $routeParams.brand;

    // try to avoid reloading the prod data
    if (!Products.products){
        Products.getProducts().then(function(data){
            Products.products = data.products;
            Products.pagination();
        });
    }else{
        Products.pagination();
    }

    // watch for when the pagination changes
    $scope.$watch('Products.currentPage + Products.numPerPage', function() {
        var begin = ((Products.currentPage - 1) * Products.numPerPage);
        var end = begin + Products.numPerPage;

        Products.pagedProducts = Products.filteredProducts.slice(begin, end);
    });
});

在服务中:

app.factory('Products', function($http, $filter, $location, $routeParams){
    var Products = {
        search: '',
        searching: false,
        filteredProducts: '',
        pagedProducts: '',
        getProduct: function(id){
            delete Products.detail;
            $http.get('/product/' + id).then(function(response){
                Products.detail = response.data.product;
            });
        },
        getProducts: function(){
            return $http.get('/product').then(function(response){
                return response.data;
            });
        },
        pagination: function(){

            // relies on fulltext filter
            this.filteredProducts = $filter('fulltext')(this.products, this.brandLimit);

            // set up default values to feed to ui pagination
            this.currentPage = 1;
            this.numPerPage = 10;
            this.maxSize = 10;

            // check the length of filtered items based on search or brand clicked (in the URL)
            this.totalItems = this.filteredProducts.length;
            this.numPages =  Math.ceil(this.totalItems / this.numPerPage);
        },
        brandTitle: function() {

            if (this.searching === false || this.brand) {
                this.search = '';
                return $routeParams.brand + " Products";
            } else {
                return 'Searching "' + $routeParams.brandLimit + '"';
            }
        },
        searchTerm: function(){
            if(this.search){
                $location.path("search/" + this.search);
                this.searching = true;
            }else{
                $location.path("/");
                this.searching = false;
            }
        }
    };
    return Products;
});

和HTML:

<pagination ng-show="Products.numPages" total-items="Products.totalItems" ng-model="Products.currentPage" max-size="Products.maxSize" class="pagination-small" boundary-links="true" rotate="false" num-pages="Products.numPages"></pagination>

<table class="table table-striped">
    <tr>
        <th>Maker</th>
        <th>Title</th>
        <th ng-bind="product.priceDealer">Dealer Price</th>
        <th>MSRP</th>
    </tr>
    <tr ng-repeat="product in Products.pagedProducts">
        <td>{{product.brand}}</td>
        <td><a href="#/product-detail/{{product.id}}/{{product.title | slug}}">{{product.title}}</a></td>
        <td ng-bind="product.priceDealer | currency"></td>
        <td>{{product.msrp | currency:"$"}}<td>
        </tr>
    </table>

答案 2 :(得分:0)

不需要所有这些,使用角度UI Bootstrap的属性:

HTML

<pager total-items="totalItems" ng-model="currentPage" items-per-page="itemsPerPage"></pager>

==== 并在控制器中添加以下代码

===========

$scope.totalItems = $scope.testimonials.length;
$scope.itemsPerPage = 5;
$scope.currentPage = 1;

$scope.$watch('currentPage + itemsPerPage', function () {
        var begin = (($scope.currentPage - 1) * $scope.itemsPerPage),
            end = begin + $scope.itemsPerPage;

        $scope.filteredtestimonials= $scope.alerts.slice(begin, end);
    });

===========

请注意,您需要在过滤的评论中提及ng-repeat =&#34;见证&#34;

和属性应与您使用ng-repeat

的范围相同

如果您仍然遇到任何问题,请与我们联系。您可以在http://angular-ui.github.io/bootstrap/#/pagination

上看到更多相关示例

请包括:

在您的页面或布局页面中,每页的项目不会直接取值,似乎