2015-01-15 160 views
5

我有一个使用ngTable在表上显示的对象列表。 我的目标是这样的:ngtable:对嵌套对象进行排序和过滤

obj {label:string, 
    nestObj{nestLabel:string 
      } 
    } 

在我的控制器我想允许排序和字段“标签”和“nestObject.label”上过滤。我曾经尝试这样做:

$scope.tableParams = new ngTableParams({ 
     page: 1,   // show first page 
     count: 10, 
     filter: { 
      label='', 
      nestObj.label='' 
     }, 
     sorting: { 
      label: 'asc', 
      nestObj.label: 'asc' 
     } 
    }, { 
     total: data.length, // length of data 
     getData: function($defer, params) { 
      // use build-in angular filter 
      var filteredData = params.filter() ? 
      $filter('filter')(data, params.filter()) : 
      data; 
      var orderedData = params.sorting() ? 
        $filter('orderBy')(filteredData, params.orderBy()) : 
        data; 

      params.total(orderedData.length); // set total for recalc pagination 
      $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count())); 
    }   
}); 

但我米得到一个错误,JavaScript编译器不喜欢上nestObj.label过滤器:

Uncaugth syntexError:意外的标记。

如果我不对nestObj.label进行过滤和排序,它会很好地工作。

是否可以使用ngTable对嵌套对象进行过滤和排序?

这是说明问题的plunker

谢谢。

+0

你能为我们提供plunker还是jsfiddle ..? – squiroid

+0

我在主消息中添加了plunkr – user1260928

回答

8

不幸的是,现在对于嵌套对象的过滤和排序在ng-table中是不合适的。阅读这个post以及来自@Kostia Mololkin的解决方案,我终于知道如何避免这个错误,并且解决方案最终非常简单。非常感谢他!

我只是改写了数组,其中为您的数据:初始化的新属性,并从嵌套对象中的数据集到像新的属性:

for (var i = 0; i < data.length; i++) { 
    data[i].town = ""; //initialization of new property 
    data[i].town = data[i].adresse.town; //set the data from nested obj into new property 
} 

你可以在这里看到plunker这个解决方案, 现在是像一个魅力工作...

+0

我删除了我以前的答案,因为我完全错误地解决了这个问题。希望就是这样! :) – arman1991

+0

感谢arman,它现在工作正常;) – user1260928

+0

如果你对这个解决方案感到满意,你也可以接受我的回答:)我很高兴我的帮助。 – arman1991

0

只要我碰到我的两分钱,不要害怕使用函数式编程。扁平化的数据很简单,在我看来更清洁,像这样:

var flattenedArray = dataArray.map(function(obj) { 
    return { 
     label: obj.label, 
     nestedLabel: dataItem.nestedObj.nestedLabel 
    }; 
}); 

然后你就可以labelnestedLabel在ngTable轻松进行排序。

注:我意识到我们正在复制这里,所以消耗更多的内存。

0

这是一个getData方法来支持嵌套params和额外的支持订购和分页。需要注入$filter并用您自己的数据数组重新命名myData。希望它可以帮助。

$scope.tableParams = new NgTableParams({}, 
{ 
    getData: function($defer, params) { 

     // organize filter as $filter understand it (graph object) 
     var filters = {}; 
     angular.forEach(params.filter(), function(val,key){ 
      var filter = filters; 
      var parts = key.split('.'); 
      for (var i=0;i<parts.length;i++){ 
       if (i!=parts.length-1) { 
        filter[parts[i]] = {}; 
        filter = filter[parts[i]]; 
       } 
       else { 
        filter[parts[i]] = val; 
       } 
      } 
     }) 

     // filter with $filter (don't forget to inject it) 
     var filteredDatas = 
      params.filter() ? 
       $filter('filter')(myDatas, filters) : 
       myDatas; 

     // ordering 
     var sorting = params.sorting(); 
     var key = sorting ? Object.keys(sorting)[0] : null; 
     var orderedDatas = sorting ? $filter('orderBy')(filteredDatas, key, sorting[key] == 'desc') : filteredDatas; 

     // get for the wanted subset 
     var splitedDatas = 
      orderedDatas.slice((params.page() - 1) * params.count(), 
       params.page() * params.count()); 

     params.total(splitedDatas.length); 

     // resolve the ngTable promise 
     $defer.resolve(splitedDatas); 
    } 
}); 
相关问题