2016-08-16 2 views
4

Я пытаюсь показать данные по html с помощью ngTable.ngTable не сортирует?

В html я сделал все столбцы «сортируемыми».

<table ng-table="fm.tableParams" class="table" show-filter="false"> 
     <tr ng-repeat="report in $data"> 
      <td title="'ReportId'" sortable="'reportId'" class="text-center"> 
       {{report.reportId}}</td> 
      <td title="'SampleId'" sortable="'sampleId'" class="text-center"> 
       {{report.sampleId}}</td> 
      <td title="'MRN'" sortable="'mrn'" class="text-center"> 
       {{report.mrn}}</td> 
      <td title="'Diagnosis'" sortable="'diagnosis'" class="text-center"> 
       {{report.diagnosis}}</td> 
     </tr> 
    </table> 

Данные извлекаются с сервера. controller.js

ristoreApp.controller("fmCtrl", 
    ['$scope', 'fmFactory', 'NgTableParams', function($scope, fmFactory, NgTableParams) { 
     var self = this; 
     $scope.selection = '0'; 
     $scope.fmSearch = function() { 
      if ($scope.selection == '0') { 
       self.tableParams = new NgTableParams({ 
        page: 1,   // show first page 
        count: 10,   // count per page 
       }, { 
        getData: function (params) { 
         return fmFactory.getAll().then(function(response) { 
          var reports = response.data; 
          params.total(reports.length); 
          console.log(reports.length); 
          return reports; 
         }); 

        } 
       }); 
       self.tableParams.reload(); 
      } 
     } 
    }] 
) 

Это делает шоу записей на странице. Однако сортировка не работает ни для одного из столбцов. Что мне нужно сделать, чтобы он работал?

EDIT:. Согласно ngtable.com, «Вы должны будете применить значения из NgTableParams.sorting() для данных, которые вы хотите отобразить в таблице Это, как правило, в случае, когда данные быть неправдоподобным с сервера ». Однако он не сказал, как применить этот метод к данным. Кажется, ngtable 1.0.0 плохо документирован и не хватает примеров. Может ли кто-нибудь показать мне, как сортировать на стороне клиента?

ответ

1

Автоматическая сортировка работает только при использовании с полной dataset собственности (как это можно увидеть в простых примерах here).

Когда вы реализуете метод getData(), для сортировки вам нужна ваша очередь (или, в большинстве случаев, задача сервера). В свойстве params вы найдете sorting, который обычно требуется передать серверу, чтобы сервер мог выполнять сортировку. Особенно, когда вы используете разбитый на страницы (и таким образом возвращаете не все элементы одновременно) серверу необходимо выполнить сортировку перед выбором соответствующих элементов для страницы.

Так что, если у вас нет большого количества предметов и вам не нужна разбивка на страницы, вы можете отсортировать массив до его возвращения. Если вы не хотите загружать все элементы заранее, вам необходимо передать информацию о сортировке на сервер и позволить серверу выполнять сортировку и подкачку.

+1

Итак, каждый раз, когда я нажимаю на маленькие стрелки каждого столбца на веб-странице, я отправляю запрос на сервер и получаю список json с определенным порядком? Все, что я сделал, чтобы получить данные с сервера, - это вызов rest api. Как указать другой порядок по другому столбцу в HTTP-запросе? – ddd

+1

Это сильно зависит от остальных апи, которые вы нацеливаете. Если api не поддерживает сортировку, единственный способ решить эту проблему - загрузить все элементы и отсортировать элементы на стороне клиента. –

+0

Это именно то, что я собираюсь сделать - сортировка их на стороне клиента. Как мне это сделать? – ddd

0

Добавьте ngTable к тому месту, где вы объявили свой модуль приложения. Пример: angular.module ("myApp", ["ngTable"]);

Затем используйте NgTableParams.sorting() http://ng-table.com/#/sorting/demo-sorting-basic

+0

Как применить сортировку() к данным? На веб-сайте, похоже, нет примера для этого случая. – ddd

+1

@ddd, вы используете orderBy для этого. https://docs.angularjs.org/api/ng/filter/orderBy https://scotch.io/tutorials/sort-and-filter-a-table-using-angular HTTP: // www.w3schools.com/angular/ng_filter_orderby.asp – taiwoorogbangba

1

ОК, в моем случае, я использую getData для вызова службы api rest, которая возвращает только одну страницу с 30 строками данных, поэтому мне нужно указать в параметрах моего браузера текущую страницу, размер страницы, поле сортировать и порядок ('ASC' или 'DESC'), как:

http://localhost:3000/api/my_service/?current_page=1&page_size=30&field_sort=date&order_sort=desc 

Итак, чтобы сделать это у меня в GetData:

getData: function(params){ 
    var sorter  = params.sorting() 
    vm.sortField = Object.keys(sorter)[0] 
    vm.sortOrder = sorter[Object.keys(sorter)[0]] 
    vm.currentPage = vm.sortField.length == 0 ? params.page() : 1 
    vm.pageSize = params.count() 
    return $http.get(get_service()).then(
    function(e){ 
     vm.posts = e.data.posts 
     params.total(vm.totalPosts) 
     return vm.posts 
    }, 
    function(e){ 
     console.error(e) 
    } 
) 
}