gpt4 book ai didi

AngularJS ngTable 按日期过滤

转载 作者:行者123 更新时间:2023-12-03 00:20:11 28 4
gpt4 key购买 nike

我正在尝试在我的应用程序中设置 ngTable,但它不支持按日期过滤,而且我不知道如何实现它。我最初将数据中的日期作为时间戳,这使我能够由于时间戳的增量性质而对列进行正确排序,但显然我无法输入 9 月并过滤数据。

// Example row data from data array
{
"index": 0,
"id": "54587313ac91d561b246bf90",
"user": "user3",
"date": 1390054873445,
"status": "in-progress"
}

我尝试将其设置为字符串,但是当您过滤或排序时,它不会产生升序/降序顺序,而是按照数据中组织的顺序排列。

// Date output not in asc/desc if use date string
September 8, 2014
September 27, 2014
September 23, 2014
September 26, 2014

我一直在浏览 ngTable 并发现我可以更改表的标题,所以我捕获了一个副本来编辑并添加某种自定义过滤器或指令?也许我应该使用不同的日期字符串?我创建了一个Plunker使用时间戳数据的应用程序,该数据经过过滤以显示给用户并可排序,但我希望能够通过输入月份、日期和/或年份进行过滤,即。 2014年9月等

// Example date column setup
<td data-title="'Date'"
sortable="'date'"
filter="{ 'date': 'text' }"
ng-bind="(doc.date | date:mediumDate)"></td>

更新我刚刚注意到在 ngTable.js 的底部,您可以放入自己的过滤器。我最终弄清楚了如何将外部文件加载到自定义过滤器而不是内联 ngTemplates:

<td data-title="'Date'" 
sortable="'date'"
filter="{ 'date': 'date' }" // add name of filter (date), to the value of assoc array
ng-bind="(loan.date | date:mediumDate)"></td>

或者将文件放置在应用程序中更有用的位置:

<td data-title="'Date'" 
sortable="'date'"
filter="{ 'date': 'date', templateURL: '/www/app/ng-table/filters/date.html' }"
ng-bind="(loan.date | date:mediumDate)"></td>

仍然不知道该怎么做,但会继续努力让它工作,我做了一个 Plunker到目前为止我所掌握的内容(如果有帮助的话)。这应该是 date.html 中的指令吗?

最佳答案

您可以通过定义如下所示的自定义过滤器来实现此目的:

angular.module("tableApp", ['ngTable'])

.filter('customUserDateFilter', function($filter) {
return function(values, dateString) {
var filtered = [];

if(typeof values != 'undefined' && typeof dateString != 'undefined') {
angular.forEach(values, function(value) {
if($filter('date')(value.Date).indexOf(dateString) >= 0) {
filtered.push(value);
}
});
}

return filtered;
}
})

.controller("MyCtrl", function($scope, $filter, ngTableParams) {
var data = [
{ Name: 'John', Date: new Date('1/1/2014') },
{ Name: 'Doe', Date: new Date('1/2/2014') },
{ Name: 'Jane', Date: new Date('2/1/2014') }
];

$scope.tableParams = new ngTableParams({
page: 1, // show first page
count: 10, // count per page
}, {
total: data.length, // length of data
getData: function($defer, params) {
// use build-in angular filter
var filters = params.filter();
var tempDateFilter;

var orderedData = params.sorting() ?
$filter('orderBy')(data, params.orderBy()) :
data;

if(filters) {
if(filters.Date) {
orderedData = $filter('customUserDateFilter')(orderedData, filters.Date);
tempDateFilter = filters.Date;
delete filters.Date;
}
orderedData = $filter('filter')(orderedData, filters);
filters.Date = tempDateFilter;
}

$scope.users = orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count());

params.total(orderedData.length); // set total for recalc pagination
$defer.resolve($scope.users);
}
});
})
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="//cdn.jsdelivr.net/angular.ngtable/0.3.3/ng-table.js"></script>
<link rel="stylesheet" href="//cdn.jsdelivr.net/angular.ngtable/0.3.3/ng-table.css" />

<div ng-app="tableApp" ng-controller="MyCtrl">
<table ng-table="tableParams" show-filter="true" class="table">
<tr ng-repeat="user in $data">
<td data-title="'Name'" filter="{ 'Name': 'text' }" sortable="'Name'">
{{user.Name}}
</td>
<td data-title="'Date'" filter="{ 'Date': 'text' }" sortable="'Date'">
{{user.Date | date}}
</td>
</tr>
</table>
</div>

关于AngularJS ngTable 按日期过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26729542/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com