ngtable : sort and filter on nested object

匿名 (未验证) 提交于 2019-12-03 01:34:02

问题:

I have a list of objects to display on a table with ngTable. My object looks like :

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

In my controller I want to allow sorting and filtering on fields 'label' and 'nestObject.label'. I have tried this:

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

But I m getting an error, the javascript compiler doesn't like the filter on nestObj.label :

Uncaugth syntexError : unexpected token .

IT works well if I don't filter and sort on nestObj.label.

Is it possible to filter and sort on nested object with ngTable?

Here is the plunker that illustrate the problem.

Thank you.

回答1:

Unfortunately, the filtering and sorting with nested objects is not suitable in ng-table for now. Reading this post and solution from @Kostia Mololkin, I finally got it how to avoid this bug and the solution is in the end very simple. Big thanks to him!

I just rewrote the array where is your data: initialized the new property and set the data from nested object into the new property like:

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 } 

You can see this solution here on plunker, now it's working like a charm...



回答2:

Just adding my two cents as I came across, don't be afraid to make use of functional programming. Flattening data is simple and in my opinion cleaner like so:

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

Then you can sort by label and nestedLabel in ngTable with ease.

Note: I realize we are making copies here so a little more memory is consumed.



回答3:

Here is a getData method to support nested params and additional support for ordering and paging. Need to inject $filter and rename myData with your own array of datas. Hope it can help.

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


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!