【问题标题】:AngularJS ngTable the pagination not working, showing all data on one pageAngularJS ngTable分页不起作用,在一页上显示所有数据
【发布时间】:2016-10-25 22:43:31
【问题描述】:

我正在使用 ngTables 以表格格式加载我的数据并显示分页。我的数据是从 Firebase 数据库加载的,目前长度为 9。所以我想每页显示三行。

下面是我的代码,当我的页面加载时,所有九行都加载在第一页上,而我将计数设置为 3,并且当我点击页面时,它不会继续。

这还有一个问题,过滤也不起作用。

这是我在 HTML 视图中的 ng-table 并没有改变:

<div ng-controller="mycontroller">
    <strong>Filter:</strong> {{tableParams.filter()|json}}
        <table ng-table="tableParams" show-filter="true" class="table table-striped">
            <tr ng-repeat="obj in mylist">
                <td data-title="'Department'" filter="{ 'name': 'text' }">{{ obj.department }}</td>
                <td data-title="'Lastname'" >{{ obj.lastname }}</td>
                <td data-title="'City'">{{ obj.city }}</td>
            </tr>
        </table>
</div>

mycontroller.js

app.controller('mycontroller', ["$scope", "$filter", "ngTableParams", "DatabaseRef", "$firebaseArray",
    function ($scope, $filter, ngTableParams, DatabaseRef, $firebaseArray) {

        //get all data from firebase database
        var mydb = DatabaseRef.ref("projects").orderByKey();
        $scope.mylist = $firebaseArray(mydb);

        var data = $scope.mylist;
        data.$loaded().then(function(data) {
            console.log(data.length); // data is loaded here, and the length is 9
            $scope.tableParams = new ngTableParams({
                page: 1, // show first page
                count: 3, // count per page
                filter: {
                    name: '' // initial filter
                }
            }, {
                total: data.length, // length of data
                getData: function ($defer, params) {
                    // use build-in angular filter
                    var orderedData = params.filter() ? $filter('filter')(data, params.filter()) : data;
                    $scope.users = orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count());
                    params.total(orderedData.length);
                    // set total for recalc pagination
                    $defer.resolve($scope.users);
                }
            });
        });
    }]);

【问题讨论】:

    标签: javascript angularjs firebase firebase-realtime-database ngtable


    【解决方案1】:

    这是可行的解决方案:

    app.controller('mycontroller', ["$scope", "$filter", "ngTableParams", "DatabaseRef", "$firebaseArray",
        function ($scope, $filter, ngTableParams, DatabaseRef, $firebaseArray) {
    
            //get all data from firebase database
            var mydb = DatabaseRef.ref("projects").orderByKey();
            $scope.mylist = $firebaseArray(mydb);
    
            var data = $scope.mylist;
            data.$loaded().then(function(data) {
                console.log(data.length); // data is loaded here, and the length is 9
                $scope.tableParams = new ngTableParams({
                    page: 1, // show first page
                    count: 3, // count per page
                    filter: {
                        name: '' // initial filter
                    },
                    sorting: { city: "asc" }
                }, {
                filterSwitch: true,
                total: 0, //data.length, // length of data
                getData: function ($defer, params) {
                    // use build-in angular filter
                    var filteredData = params.filter() ?
                        $filter('filter')(data, params.filter()) :
                        $scope.mylist;
    
                    var orderedData = params.sorting() ?
                        $filter('orderBy')(filteredData, params.orderBy()) : filteredData;
    
                    params.total($scope.mylist.length);
                    // set total for recalc pagination
                    $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
    
    
                    }
                });
            });
        }]);
    

    【讨论】:

    • 但过滤不起作用!分页和排序工作正常。
    【解决方案2】:
    • page 参数是额外的,因为默认值无论如何都是 1。
    • filter 是额外的,因为默认情况下它是空的。
    • total 是额外的,因为默认情况下它会自动获取数据集的长度
    • getData 是额外的。您不需要自定义过滤。 ngTable 进行过滤

    我建议替换此代码

    console.log(data.length); // data is loaded here, and the length is 9
    $scope.tableParams = new ngTableParams({
        page: 1, // show first page
        count: 3, // count per page
        filter: {
            name: '' // initial filter
        }
    }, {
        total: data.length, // length of data
        getData: function ($defer, params) {
            // use build-in angular filter
            var orderedData = params.filter() ? $filter('filter')(data, params.filter()) : data;
            $scope.users = orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count());
            params.total(orderedData.length);
            // set total for recalc pagination
            $defer.resolve($scope.users);
        }
    });
    

    进入这个。

    console.log(data.length); // data is loaded here, and the length is 9
    $scope.tableParams = new ngTableParams({
        count: 3, // count per page
    }, {
        dataset: data
    });
    

    并在 HTML 中将此 ng-repeat="obj in mylist" 更改为此 ng-repeat="obj in $data"

    【讨论】:

    • 这根本不起作用!没有显示我的桌子,我已经在显示了。
    【解决方案3】:

    这里有一个简单的例子,说明如何使用ngTable 添加分页。

    显然,请确保添加对 angularjs 的引用。

    <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.2/angular.js"></script>
    

    添加对 ngTable javascript 和 css 的引用。

    <link rel="stylesheet"; href="https://unpkg.com/ng-table@2.0.2/bundles/ng-table.min.css">
    <script src="https://unpkg.com/ng-table@2.0.2/bundles/ng-table.min.js"></script>
    

    创建ngApp 后,在视图中创建表。

    更新:

    <strong>Filter:</strong> {{tableParams.filter()|json}}
    <table ng-table="tableParams" show-filter="true" class="table table-striped">
        <tr ng-repeat="obj in myList">
            <td data-title="'Department'" filter="{ department: 'text' }" sortable="'department'">{{ obj.department }}</td>
            <td data-title="'Lastname'" >{{ obj.lastname }}</td>
            <td data-title="'City'">{{ obj.city }}</td>
        </tr>
    </table>
    

    在您的控制器上,从data.$loaded() 中删除$scope.tableParams 并直接使用$scope.myList

    app.controller('mycontroller', ["$scope", "$filter", "ngTableParams", "DatabaseRef", "$firebaseArray",
    function ($scope, $filter, ngTableParams, DatabaseRef, $firebaseArray) {
    
        //get all data from firebase database
        var mydb = DatabaseRef.ref("projects").orderByKey();
        $scope.mylist = $firebaseArray(mydb);
    
        $scope.mylist.$loaded().then(function(data) {
            console.log(data.length); // data is loaded here, and the length is 9
            $scope.arrayLength = data.length;
        });
    
        $scope.tableParams = new ngTableParams({
                page: 1, // show first page
                count: 3, // count per page
                filter: {
                    department: '' // initial filter
                }
            }, {
                total: $scope.arrayLength, // length of data
                getData: function ($defer, params) {
                    // use build-in angular filter
                    $scope.mylist = $defer.resolve(params.filter() ? $filter('filter')($scope.mylist, params.filter()) : $scope.mylist);
                    $scope.users = $scope.mylist.slice((params.page() - 1) * params.count(), params.page() * params.count());
                    // set total for recalc pagination
                    params.total($scope.mylist.length);                    
                }
        });
    }]);
    

    【讨论】:

    • 我检查了一切,一切正常,但仍然无法正常工作!即使我再次添加可排序,它也不起作用,当我点击它时,什么也没有发生。
    • @Mpondomise 我根据您的回复更新了我的答案。试试看。
    • orderedData 未定义。为什么?我得到一个错误!并且推迟解析行,缺少一个右括号。请更新您的答案以获得工作版本;谢谢。
    • @Mpondomise 对此感到抱歉。已更正。
    • 它给出了angular.js:11655TypeError: Cannot read property 'slice' of undefined 实际上上面的这个答案stackoverflow.com/a/40269460/4835480 对我来说非常好,但过滤不起作用。你怎么能解决这个问题?如果你修复它,我会接受你的作为答案。我犯了一个错误,我没有定义users,所以我不需要它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多