我是Angularjs的新手需要一些帮助,以毫秒为单位按降序排序日期以及表列的过滤器。我创建了一个plunker here但是当我键入一些过滤器参数时,我没有看到任何过滤的数据,并且数据从表中丢失。
请帮我排序日期列并进行不区分大小写的过滤搜索,下面我提供了我的代码。
<table ng-table="tableParams" show-filter="true" class="table" >
<tr ng-repeat="item in $data" height="10px">
<td data-title="'Date'" filter="{ 'item[0]': 'date' }" sortable="'item[0]'">{{translate(item[0])}}</td>
<td data-title="'Count'" filter="{ 'item[1]': 'text' }" sortable="'item[1]'">{{item[1]}}</td>
</tr>
</table>
$scope.translate = function(value) {
if (value == null || value == undefined)
return value;
var monthNames = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];
var myDate = new Date( value );
return myDate.getDate() + " " + monthNames[myDate.getMonth()] + " "+myDate.getFullYear();
}
$scope.tableParams = new ngTableParams({
page: 1, // show first page
count: 10 // count per page
}, {
total: $scope.tasksRunDataForTable.length, // length of data
getData: function($defer, params) {
// use build-in angular filter
var sortedData = params.sorting() ?
$filter('orderBy')($scope.tasksRunDataForTable, params.orderBy()) :
$scope.tasksRunDataForTable;
var orderedData = params.filter() ?
$filter('filter')(sortedData, params.filter()) :
sortedData;
params.total(orderedData.length); // set total for recalc pagination
$defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
}
});
更新
我可以在计数上获得过滤器工作,但是在两列上没有运行日期和排序。 Updated plunker
<td data-title="'Count'" filter="{ '1': 'text' }" sortable="'1'">{{item[1]}}</td>
答案 0 :(得分:4)
日期排序
这不是ngTable的问题,而是“订单”的底层角度过滤器的问题。作品。
分别使用valueOf()[0]
,valueOf()[1]
分别为0&amp; 1是内部数组的索引。
这是html,无需更改getData回调。
<table ng-table="tableParams" show-filter="true" class="table" >
<tr ng-repeat="item in $data" height="10px">
<td data-title="'Date'" filter="{ '0': 'text' }" sortable="valueOf()[0]">{{ item[0] | date: 'd MMM yyyy HH:mm' }}</td>
<td data-title="'Count'" filter="{ '1': 'text' }" sortable="valueOf()[1]">{{ item[1] }}</td>
</tr>
</table>
请注意,您不需要翻译来显示您的日期,从毫秒开始,因为其他角度过滤器支持日期&#39;。
另见相关帖子 https://stackoverflow.com/a/15858739/61577
日期过滤(来自字符串)
为了实现从日期过滤,您需要使用自定义&#34; comperator&#34;在控制器上进行过滤时,它可以作为第三个参数。像这样的东西可以解决这个问题
var dateComperator = function(obj, text) {
var valueAsText = obj + '';
if (valueAsText.length == 13) { // must be milliseconds.
valueAsText = $filter('date')(obj, 'd MMM yyyy HH:mm');
}
return !text || (obj && valueAsText.toLowerCase().indexOf(text.toLowerCase()) > -1);
};
然后在你的控制器getData回调:
getData: function($defer, params) {
// use build-in angular filter
var sortedData = params.sorting() ?
$filter('orderBy')($scope.tasksRunDataForTable, params.orderBy()) :
$scope.tasksRunDataForTable;
var filterInfo = params.filter();
var comparer = (filterInfo && filterInfo['0']) ? dateComparer : undefined;
$log.log(angular.toJson(filterInfo))
var orderedData = filterInfo ?
$filter('filter')(sortedData, filterInfo, comparer) :
sortedData;
params.total(orderedData.length); // set total for recalc pagination
$defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
}
更新:更新了解决过滤问题的答案。 更新2 :在使用日期和计数进行搜索时更新了要解决的问题。
这是完整的plunker http://plnkr.co/edit/D2n7MdAfugXpKeKOGosL?p=preview
希望这有帮助。
答案 1 :(得分:0)
我的解决方案:
$scope.tableParams = new ngTableParams({
page: 1, // show first page
count: STATIC_CONST.COUNT_PAGAING, // count per page IMPORTANT
sorting: { Id: "desc" }
}, {
total: data.length, // length of data
paginationMaxBlocks: 13,
paginationMinBlocks: 2,
getData: function ($defer, params) {
var filters = angular.copy( params.filter() );
//var filters = params.filter();
var filteredData = data;
//Custom filters:
if (typeof filters['LastUpdateDate'] !== 'undefined') {
filteredData = $filter('filterByUI')(filteredData, 'LastUpdateDate', filters['LastUpdateDate'], $filter('date'), ['dd.MM.yyyy']);
delete filters['LastUpdateDate'];
}
//General filters:
if (filters) {
// use build-in angular filter
filteredData = $filter('filter')(filteredData, filters);
}
//if (filters.FromDate) {
// filteredData = $filter('filterDates')(data, filters.FromDate);
//}
var orderedData = params.sorting() ?
$filter('orderBy')(filteredData, params.orderBy()) :
filteredData;
params.total(orderedData.length); // set total for recalc pagination
$defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
}
});
Layout.html:
<table ng-table="tableParams" show-filter="true" class="table" >
<tr ng-repeat="item in $data" height="10px">
<td data-title="'Date'" filter="{ 'LastUpdateDate': 'text' }" sortable="valueOf()[0]">{{ item[0] | date: 'd MMM yyyy HH:mm' }}</td>
<td data-title="'Count'" filter="{ '1': 'text' }" sortable="valueOf()[1]">{{ item[1] }}</td>
</tr>
\ APPS \ app.module.js:
app.filter("filterByUI", function () {
debugger;
return function (arrayData, dateKey, dateValue, filterFunction, filterFunctionParams) {
var returnarr = [];
returnarr = arrayData.filter(function (element) {
var evalCode = "filterFunction( element." +dateKey;
filterFunctionParams.forEach(function (element, index, array) {
evalCode += ", filterFunctionParams["+index+"]";
});
evalCode += ")";
try{
var dudi86 = eval(evalCode);
if(typeof dudi86 === 'number') {
dudi86 = dudi86.toString();
}
if(typeof dudi86 === 'string') {
return dudi86.toLowerCase().indexOf( dateValue.toString().toLowerCase() ) > -1;
}
if( Array.isArray(dudi86) ) {
if( Array.isArray(dateValue) ) {
return dateValue.every( function(val) { return dudi86.indexOf(val) >= 0; } );
}
if(typeof dateValue === 'string' || typeof dateValue === 'number') {
//TODO: Consider this case:
return dudi86.indexOf( dateValue.toString().toLowerCase() ) > -1;
}
}
}catch(e){
console.log("app.filterByUI: Error on evaluating: " +evalCode);
}
return false;
});
return returnarr;
}
});