Loading JSON via AJAX with NgTable parameters

后端 未结 4 1881
情话喂你
情话喂你 2021-01-11 23:06

I\'m trying to use ngTables to sort and filter data using an AJAX call. Currently I am able to replicate the data with an ng-repeat, but none of my sorting functions apply.

相关标签:
4条回答
  • 2021-01-11 23:11

    $defer need to be resolved within the getData, after the ajax call is completed. As in the example You provided, the ajax call is inside the getData:

    var app = angular.module('app', ['ngTable']);
    
    app.controller('myController', function($scope, $http, $filter, ngTableParams) {
    
    $scope.tableParams = new ngTableParams({
        page: 1,            // show first page
        count: 10,          // count per page
        sorting: {
            foo: 'asc'     // initial sorting
        }
    }, {
        total: data.length, // length of data
        getData: function($defer, params) {
            $http.get('http://jsondata.com/myjson.json')
               .success(function(data, status) {
    
                   // use build-in angular filter
                   var orderedData = params.sorting() ?
                       $filter('orderBy')(data, params.orderBy()) :
                       data;
    
                   $defer.resolve(orderedData.slice((params.page() - 1) * params.count(),  params.page() * params.count()));
                });
            }
        });
    });
    
    0 讨论(0)
  • 2021-01-11 23:13

    First step is to put quotes around your sortable attribute:

      <td data-title="foo" sortable="'foo'">{{user.foo}}</td>
    

    ngTable expects an expression there.

    Second step is to check which version of ngTable you're using, and if it's 0.3.2 check out this ngTable issue: https://github.com/esvit/ng-table/issues/204

    Good luck)

    0 讨论(0)
  • 2021-01-11 23:18
    <tr ng-repeat="user in $data">
          <td data-title="foo" sortable="foo">{{user.foo}}</td>
          <td data-title="bar" sortable="bar">{{user.bar}}</td>
    </tr>
    

    You can directly refer data in your js no need to $scope.data = data. I tried and worked fine for me.

    0 讨论(0)
  • 2021-01-11 23:34

    you problem is that you use the local variable data inside your ngTableParams and in the same time you are outside the scope of the success function.

    Change your code on something like this:

    var app = angular.module('app', ['ngTable']);
    
    app.controller('myController', function($scope, $http, $filter, ngTableParams) {
    
     $http.get('http://jsondata.com/myjson.json')
      .success(function(data, status) {
        $scope.data = data;
    
        $scope.tableParams = new ngTableParams({
            page: 1,            // show first page
            count: 10,          // count per page
            sorting: {
                foo: 'asc'     // initial sorting
            }
        }, {
            total: $scope.data.length, // length of data
            getData: function($defer, params) {
                // use build-in angular filter
                var orderedData = params.sorting() ?
                                    $filter('orderBy')($scope.data, params.orderBy()) :
                                    $scope.data;
    
                $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
            }
          });
      });
    
    
    });
    

    See the change from data to $scope.data inside ngTableParams.

    Hint: If you just place your ngTableParams inside your success function, is going to work too, without changing data to $scope.data. But, changing the variables will give you a better flexibility if you want to reload() your table.

    0 讨论(0)
提交回复
热议问题