9

我正在尝试将其ngTable directive应用于我的 Rails 应用程序,但无法正确处理。我仍然是 Angular 的新手,而且这个指令的文档似乎很差(尽管有很多很好的例子)。

所以我有一个名为的数组,$scope.users其中包含我需要的所有用户信息(例如,像这样),它来自$resource query().

我需要把它变成一张桌子:

  1. 排序
  2. 分页
  3. 从一个输入中过滤(就像在此处完成的那样)

有人可以提供解决方案或至少建议如何将它们组合在一起吗?

更新

因此,在 irc 频道上 wafflejock 的大力帮助下,我已经能够整合一些功能。这是笨拙的。

还有什么问题:

  1. 每次我更改页面、排序或其他任何内容时,都会请求 json 数据集。这是大量的请求,所以我需要以某种方式对其进行缓存。
  2. 我需要能够从控制器操作数据集以更改值并在需要时删除用户。仍然不知道如何实现。
4

3 回答 3

11

嗨,Almaron(又名 Malkav)我是 IRC 的 wafflejock,这是我能做到的最好的工作:

http://plnkr.co/edit/TUOYmM?p=preview

var app = angular.module('main', ['ngTable']).
controller('DemoCtrl', function($scope, ngTableParams, NameService) {

    var data = NameService.data;

    $scope.tableParams = new ngTableParams(
      {
        page: 1,            // show first page
        count: 10,           // count per page
        sorting: {name:'asc'}
      },
      {
        total: 0, // length of data
        getData: function($defer, params) {
          NameService.getData($defer,params,$scope.filter);
        }
    });

    $scope.$watch("filter.$", function () {
        $scope.tableParams.reload();
    });

});

app.service("NameService", function($http, $filter){

  function filterData(data, filter){
    return $filter('filter')(data, filter)
  }

  function orderData(data, params){
    return params.sorting() ? $filter('orderBy')(data, params.orderBy()) : filteredData;
  }

  function sliceData(data, params){
    return data.slice((params.page() - 1) * params.count(), params.page() * params.count())
  }

  function transformData(data,filter,params){
    return sliceData( orderData( filterData(data,filter), params ), params);
  }

  var service = {
    cachedData:[],
    getData:function($defer, params, filter){
      if(service.cachedData.length>0){
        console.log("using cached data")
        var filteredData = filterData(service.cachedData,filter);
        var transformedData = sliceData(orderData(filteredData,params),params);
        params.total(filteredData.length)
        $defer.resolve(transformedData);
      }
      else{
        console.log("fetching data")
        $http.get("http://www.json-generator.com/api/json/get/bUAZFEHxCG").success(function(resp)
        {
          angular.copy(resp,service.cachedData)
          params.total(resp.length)
          var filteredData = $filter('filter')(resp, filter);
          var transformedData = transformData(resp,filter,params)

          $defer.resolve(transformedData);
        });  
      }

    }
  };
  return service;  
});

基本上我设置了一些函数来完成那些长行以使其更易于阅读,然后设置一个 cachedData 对象,我在调用之前检查它是否已填充......看起来它仍然非常调用两次一开始我相信你可以避免这种情况,方法是使用一个标志来检查数据是否已经被加载,如果是这样,让它等待而不是重做调用,但不确定这是一个大问题。

于 2014-06-11T04:26:45.227 回答
0

的第二个参数$http.get接受一个配置对象 - 它采用的键之一是cache,您可以将其设置为 true 以缓存您的 get 请求。另一种减少请求的方法是使用_.debouncefrom lodashunderscore来消除在特定时间段内发出的请求。

为了编辑数据,在您的模板中,您可以使用 ng-model 输入和使用 ng-bind(或双花括号 {{ }})的跨度,并在同一变量上使用 ng-show 和 ng-hide他们进行编辑。

于 2014-06-10T11:55:54.350 回答
0

可以通过简单的 if 条件scope.returnListGrid.settings().$scope!=null来阻止第二次调用

于 2014-08-14T11:26:07.677 回答