Элементы разбиения на страницы не отображаются в ng-таблице при извлечении данных из бэкэнд

Я извлекаю список данных из бэкэнд и показываю его с помощью ng-table. Проблема в том, что он не показывает элементы управления разбиением на страницы. Раньше, когда я использовал фиктивные данные для отображения ng-таблицы, разбиение на страницы работало совершенно нормально. Может ли кто-нибудь помочь мне здесь?

Это мой HTML:

<table ng-table="tableParams" show-filter="true" class="table">
            <thead>
                    <tr>
                            <th ng-repeat="column in columns" ng-show="column.visible"
                                    class="text-center" ng-class="{
                                    'sort-asc': tableParams.isSortBy(column.field, 'asc'),
                                    'sort-desc': tableParams.isSortBy(column.field, 'desc'),
                                    'sortable': !$first
                                    }"
                                    ng-click="tableParams.sorting(column.field, tableParams.isSortBy(column.field, 'asc') ? 'desc' : 'asc')">
                                    <div>{{column.title}}</div>
                            </th>
                    </tr>

            </thead>
            <tr ng-repeat="user in data | filter:searchText">

                    <td width="30" style="text-align: left">
                            <input type="checkbox" ng-model="checkboxes.items[user.id]" />
                    </td>

                    <td data-title="'Email Id'" class="text-center" sortable="email" ng-show="columns[1].visible">
                            <span>{{user.email}}</span>
                    </td>
                    <td data-title="'User Karma'" class="text-center" sortable="userkarma" ng-show="columns[2].visible">
                            <span>{{user.userkarma}}</span>
                    </td>
                    <td data-title="'Date Joined'" class="text-center" sortable="datejoined" ng-show="columns[3].visible">
                            <span>{{user.datejoined}}</span>
                    </td>
                    <td data-title="'Unsubscribed'" class="text-center" sortable="status" ng-show="columns[4].visible">
                            <span>{{user.unsubscribed}}</span>
                    </td>
            </tr>
        </table>

Ниже представлен мой файл js:

for (var i = 0; i < UserList.getUsers()
            .length; i++) {
            $scope.data.push({
                id: UserList.getUsers()[i]._id,
                email: UserList.getUsers()[i].email,
                userkarma: UserList.getUsers()[i].healthScore,
                datejoined: moment(UserList.getUsers()[i].firstSessionAt)
                    .format("MMMM Do YYYY"),
                unsubscribed: UserList.getUsers()[i].unsubscribed
            })
        };
        $scope.columns = [{
                title: '',
                field: 'checkbox',
                visible: true
            },
            {
                title: 'Email',
                field: 'email',
                visible: true
            }, {
                title: 'User Karma',
                field: 'userkarma',
                visible: true
            }, {
                title: 'Date Joined',
                field: 'datejoined',
                visible: true
            }, {
                title: 'Unsubscribed',
                field: 'unsubscribed',
                visible: true
            }
        ];

        $scope.tableParams = new ngTableParams({
            page: 1, 
                count: 10, // count per page
                filter: {
                    name: 'M' // initial filter
                },
                sorting: {
                    name: 'asc'
                }
            }, {
                total: $scope.data.length, // length of data
                getData: function ($defer, params) {
                    // use build-in angular filter
                    var filteredData = params.filter() ?
                        $filter('filter')($scope.data, params
                            .filter()) :
                        data;
                    var orderedData = params.sorting() ?
                        $filter('orderBy')($scope.data,
                            params.orderBy()) :
                        $scope.data;
                    params.total(orderedData.length); // set total for recalc paginationemail

                    $defer.resolve(orderedData.slice((
                            params.page() -
                            1) * params.count(),
                        params.page() *
                        params.count()));
                }
            });

Ответ 1

Это происходит потому, что обычная функция $scope.tableParams.reload(), используемая для обновления данных после асинхронной загрузки данных, не обновляет общее количество элементов в таблице. Это не произошло раньше, потому что это значение правильно установлено в начале, когда вы использовали фиктивные данные.

Вам нужно добавить функцию params.total(data.length); getData, чтобы вручную обновить значение.

Ответ 2

Для меня это потому, что я использовал coffeescript, который автоматически возвращает значение последней вещи в вашей функции. Это вызывает проблемы, потому что ng-table getData() возвращает обещание, и если он не получает его, он сам создает, начиная с $defer. Используя coffeescript и не совсем правильно преобразовывая пример из Конфигурируя таблицу с wiki-страницей ngTableParams, я возвращал то, что не было обещанием.

В coffeescript убедитесь, что ваш обратный вызов getData() заканчивается либо

$defer.promise

или

return

так что ng-table получает обещание или знает, чтобы сделать его сам.

Ответ 3

Я нашел ответ. На самом деле при загрузке динамических данных возникает проблема с ng-table. Когда данные динамически загружаются, функция getData не вызывается. Так вот что я сделал. Я создал функцию refreshTable для вызова функции setTable, которая затем вызывает функцию getData и отображает таблицу.

$scope.refreshTable = function () {
            console.log('\n\n refreshing table')
            $scope['tableParams'] = {
                reload: function () {},
                settings: function () {
                    return {}
                }
            };
            $timeout(setTable, 100)
        };
        $scope.refreshTable();

        function setTable(arguments) {

            $scope.tableParams = new ngTableParams({
                page: 1, // show first page
                count: 10, // count per page
                filter: {
                    name: '' // initial filter
                },
                sorting: {
                    name: 'asc'
                }
            }, {
                filterSwitch: true,
                total: $scope.users.length, // length of data
                getData: function ($defer, params) {
                    console.log(
                        '\n\nngTable getData called now')
                    var orderedData = params.sorting() ?
                        $filter('orderBy')($scope.users,
                            params.orderBy()) :
                        data;
                    params.total(orderedData.length);
                    $defer.resolve(orderedData.slice((params.page() -
                            1) * params.count(), params.page() *
                        params.count()));
                }
            });
        }

Ответ 4

У меня была эта проблема и примененное решение, представленное здесь, но оно не решило мою проблему. Мое использование было как ниже

    <table ng-table="tableParams" class="table  ng-table table-striped"  show-filter="{{::showFilter}}">
        <tr ng-show="showHeaders">
            <th class="th-select" ng-repeat="column in columns">{{column.title}}</th>
        </tr>
        <tr ng-repeat="row in $data">
            <td ng-repeat="column in columns"  ng-show="column.visible" sortable="column.field" ng-click="save(row)">
                {{row[column.field][column.subfield] || row[column.field]}}
                <span compile="column.getValue()" ></span>
            </td>
        </tr>
    </table>

Ответ 5

У меня был такой же опыт с асинхронной нагрузкой loadData+. С моей стороны проблема заключалась в том, что данные, возвращаемые API, были массивом из двух других массивов, между тем я использовал только 1 из 2 для моей таблицы. Увидеть ниже:

*.js

return $http(options).then(function (resp) {
        params.total(resp.data.users.length)
        return resp.data
    }

*.html

 <tr ng-repeat="row in usrCtrl.servicesTable.data.users" ng-if="row.Services.hasOwnProperty(usrCtrl.selectedService)">

Вернув "resp.data.users" на стороне javascript и правильно зацикливая на "usrCtrl.servicesTable.data" на стороне html, появился пейджер!

Лоик