【问题标题】:Loading JSON via AJAX with NgTable parameters使用 NgTable 参数通过 AJAX 加载 JSON
【发布时间】:2016-03-02 12:03:39
【问题描述】:

我正在尝试使用 ngTables 通过 AJAX 调用对数据进行排序和过滤。目前我能够使用 ng-repeat 复制数据,但我的排序功能均不适用。我引用了这个示例 http://plnkr.co/edit/zuzcma?p=info 并能够使用 mock.js 文件让它工作,但现在我正在使用我加载到我的网络服务器上的一个文件,我似乎无法让它工作。

我确信答案相当简单,并感谢任何帮助。我附上了我的标记,向您展示我的控制器和 html 文件的样子。谢谢大家,如果您需要更多信息,请告诉我!

以下是我引用的 API 的一些链接。

http://bazalt-cms.com/ng-table/

http://bazalt-cms.com/ng-table/example/6

HTML:

<div ng-controller="myController">
  <table ng-table="tableParams" show-filter="true" class="table table-condensed">
    <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>
  </table>
</div>

控制器:

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: data.length, // length of data
    getData: function($defer, params) {
        // 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()));
    }
  });
});

【问题讨论】:

    标签: javascript ajax json angularjs ngtable


    【解决方案1】:

    您的问题是您在 ngTableParams 中使用局部变量数据,同时您在 success 函数的范围之外。

    更改您的代码,如下所示:

    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()));
            }
          });
      });
    
    
    });
    

    查看ngTableParams 内部从data$scope.data 的变化。

    提示:如果您只是将您的 ngTableParams 放在您的 success 函数中,也可以工作,而无需将 data 更改为 $scope.data。但是,如果您想reload() 您的表,更改变量将为您提供更好的灵活性。

    【讨论】:

    • 我遵循相同但控制台显示错误:orderedData.slice 不是函数为什么会这样?
    • 嗨@Raihan - 这是因为你返回的是对象而不是数组,在js数组中有切片功能。这里你要先把你的json对象转换成arr。
    【解决方案2】:

    $defer 需要在 ajax 调用完成后在 getData 中解析。正如您提供的示例一样,ajax 调用位于 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()));
                });
            }
        });
    });
    

    【讨论】:

    • 每次有人对排序进行更改时都会调用您的 getData 函数,这意味着您将在每次排序时对新数据进行 ajax 调用。我认为这不是有效的。
    • 嗨@michas84 - 它对我来说很好,但是如果我们想对任何列进行排序,它每次都会调用服务器来获取表数据。有没有一种方法可以一次性获取服务器数据并在客户端处理我们想要的任何内容?
    【解决方案3】:

    第一步是在你的 sortable 属性周围加上引号:

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

    ngTable 需要一个表达式。

    第二步是检查您使用的是哪个版本的 ngTable,如果是 0.3.2,请查看此 ngTable 问题:https://github.com/esvit/ng-table/issues/204

    祝你好运)

    【讨论】:

      【解决方案4】:
      <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>
      

      你可以直接在你的js中引用数据,不需要$scope.data = data。 我试过了,效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-16
        • 1970-01-01
        相关资源
        最近更新 更多